服务
YP中的为所有类都被提供“服务”。这仅仅意味着,代替对类名进行硬编码以加载,要调用的类在非常简单的配置文件中定义。该文件作为一种工厂类型来创建所需类的新实例。
一个简单的例子可能会使事情变得更清楚,所以想象你需要拉入一个Timer类的实例。最简单的方法就是创建一个新的类的实例:
$timer = new \YP\Debug\Timer();
这样做很棒。也许这个有一些默认不提供的高级报告定时器。为了做到这一点,您现在必须找到应用程序中使用了timer类的所有位置。由于您可能已将其保留在适当位置,以使应用程序的性能日志不断运行,这可能是一个耗时且容易出错的方法来处理此问题。那服务就派上用场了。
我们不用创建实例,而是让一个中心类为我们创建一个类的实例。这个类保持很简单。它仅包含我们要用作服务的每个类的一个方法。该方法通常返回该类的共享实例,传递它可能具有的任何依赖关系。然后,我们将使用调用此新类的代码替换定时器创建代码:
$timer = \Config\Services::timer();
当需要更改所使用的实现时,您可以修改服务配置文件,并且在整个应用程序中自动进行更改,而无需执行任何操作。现在你只需要利用任何新的功能,你很好。非常简单和抗错误。
注意
建议只在控制器内创建服务。其他文件(如模型和库)应具有将依赖关系传递给构造方法。
便利功能
为了获得这些功能始终可用,服务提供了两项功能。。
第一个是service(),它返回所请求服务的新实例。唯一必需的参数是服务的名称。这与服务文件中的方法名称相同:
$ogger = service('logger');
如果创建方法需要附加参数,则可以在服务名称后面传递它们。
第二个函数shared_service()与service()一样工作,但返回所需服务的共享实例:
$log = shared_service('log');
定义服务
为了使服务正常工作,你使用必须要能够依靠每个类具有固定API或接口。几乎所有的YP类都提供了一个他们坚持的接口。当您要扩展或替换核心类时,您只需要确保满足接口的要求,并且知道类是兼容的。
例如,YP_Filter类实现了YP_FilterInterface。当你想创建一个替代品,提供了不同的方式来创建的路线,你只需要创建一个实现一个新的类YP_FilterInterface:
class MY_Filter YP\Core\YP_FilterInterface
{
//这里实现的必要方法。
}
最后,修改/app/Config/Services.php创建的新实例MY_Filter 而不是YP\Core\YP_Filter:
public static function filters()
{
return new \App\Core\MY_Filter();
}
共享类
有时您需要要求只创建一个服务实例。这可以通过从工厂方法中调用的getSharedInstance()方法轻松处理。这样可以检查是否已经在类中创建并保存了一个实例,如果没有,则创建一个新的实例。所有的工厂方法都提供$getShared = true作为最后一个参数。你应该坚持的方法:
class Services
{
public static function routes($getShared = false)
{
if(!$getShared) {
return new \YP\Core\RouteCollection();
}
return self::getSharedInstance('routes');
}
}