您从 Zend Framework 1.x 了解到的是“应用程序资源”。
“应用程序资源”的概念在 Zend Framework 2 中被所谓的“服务”取代(此处为介绍)
另一个变化是模块本身。在 ZF1 中,模块主要是处理某些请求的应用程序的子部分。这在 ZF2 中不再适用:如果您的模块定义了一个服务或控制器,那么现在所有应用程序都可以访问该服务或控制器。Gary Hockin 对 ZF1 和 ZF2 之间的一些区别进行了很好的介绍。
但无论如何,模块不是独立的。它们应该在隔离的环境中开发,并且依赖尽可能少,但它们提供了影响所有应用程序的交叉关注功能。
对于您的记录器的具体情况,我建议您的模块始终定义一个记录器并使用它。有条件地定义记录器的方法如下:
class MyModule
{
public function onBootstrap($e)
{
// $e->getTarget() is the \Zend\Mvc\Application
$sm = $e->getTarget()->getServiceManager();
if (!$sm->has('some-logger-name')) {
$sm->setFactory('some-logger-name', function ($sl) {
return new MyLogger($sl->get('some-db'));
});
}
}
}
然后,您就可以在所有应用程序中使用您的“一些记录器名称”。
另一种方法是只定义记录器服务并让其他模块或配置稍后覆盖它:
class MyModule
{
public function getConfig()
{
return array(
'service_manager' => array(
'factories' => array(
'some-logger-name' => 'My\Logger\Factory\ClassName'
),
),
);
}
}
使用 实现相同getServiceConfig
,它不太灵活且无法缓存,但具有更高的优先级getConfig
(允许覆盖),并且还允许您将服务工厂定义为闭包:
class MyModule
{
public function getServiceConfig()
{
return array(
'factories' => array(
'some-logger-name' => function ($sl) {
return new MyLogger($sl->get('some-db'));
},
),
);
}
}
然后,您甚至可以定义一个必须用于决定使用哪个记录器(服务名称)的配置键。
模块和配置的概念是“最后一个模块获胜”,因此您可以'some-logger-name'
在模块中或在它之前加载的任何模块中定义服务。
相同的概念也适用于您的数据库连接。
如您所见,转向服务已经为您提供了一定程度的自由。
请记住,并不是“应用程序”为您定义了一些东西:模块定义了您的服务/配置/事件等……正在运行的应用程序是所有这些东西的组合。