好的,所以@Ocramius 只是让我知道我对它的误解是什么,initializers
并帮助我理解它。因此,这是您的问题的一个可能有效的解决方案。我对您的问题的理解是:
“如何为所有实现 DbInterface 的模型设置 DbAdapter”。这就是你的做法:
第 1 步:为invokables
所有实现DbInterface
. factory
为默认创建Zend\Db\Adapter\Adapter
一个,然后initializer
为您的DbInterface
模块.phpgetServiceConfig()
return array(
'invokables' => array(
'application-model-one' => 'Application\Model\One',
'application-model-two' => 'Application\Model\Two'
),
'factories' => array(
'Zend\Db\Adapter\Adapter' => 'Zend\Db\Adapter\AdapterServiceFactory'
),
'initializers' => array(
'DbInterfaceInitializer' => function($instance, $sm) {
if ($instance instanceof \Application\Model\DBInterface) {
$instance->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter'));
}
},
)
)
Zend\Db\Adapter\Adapter使用顶级配置数组键'db'
自动注入 dbParams
第 2 步:创建实现接口的类
应用\模型(一|二|N).php
namespace Application\Model;
class One implements DbInterface, \Zend\Db\Adapter\AdapterAwareInterface
{
/**
* @var \Zend\Db\Adapter\Adapter $dbAdapter
*/
protected $dbAdapter;
public function setDbAdapter(\Zend\Db\Adapter\Adapter $dbAdapter) {
$this->dbAdapter = $dbAdapter;
}
public function getDbAdapter() {
return $this->dbAdapter;
}
// More of your business logic or data here
}
第 3 步:使用 Controller 中的 ServiceLocator 访问这些类
SomeController.phpsomeAction()
$dbOne = $this->getServiceLocator()->get('application-model-one');
$dbTwo = $this->getServiceLocator()->get('application-model-two');
// Adapter will automatically be injected
当invokable
从 ServiceManager访问时,initializer
将被调用。然后初始化程序将自动调用Zend\Db\Adapter\Adapter
,然后从配置键中获取参数'db'
您可以从教程 Application以及
samsonasik 的博客中获得更多信息:ServiceManager Cheat-Sheet