有两种方法可以解决这个问题。
首先是让您的映射器实现Zend\Db\Adapter\AdapterAwareInterface
,并向服务管理器添加一个初始化程序,该初始化程序会将适配器注入任何实现该接口的服务中。如果你这样做,你所有的映射器都可以放在invokables
服务配置的键中,而不是每个都需要一个工厂。
然后,您的映射器看起来都与此相似
<?php
namespace Foo\Mapper;
use Zend\Db\Adapter\Adapter;
use Zend\Db\Adapter\AdapterAwareInterface;
// if you're using php5.4 you can also make use of the trait
// use Zend\Db\Adapter\AdapterAwareTrait;
class BarMapper implements AdapterAwareInterface;
{
// use AdapterAwareTrait;
// ..
/**
* @var Adapter
*/
protected $adapter = null;
/**
* Set db adapter
*
* @param Adapter $adapter
* @return mixed
*/
public function setDbAdapter(Adapter $adapter)
{
$this->adapter = $adapter;
return $this;
}
}
在您的服务管理器配置中,将您的映射器放在可调用对象下,并为 AdapterAware 服务添加一个初始化程序
return array(
'invokables' => array(
// ..
'Foo/Mapper/Bar' => 'Foo/Mapper/BarMapper',
// ..
),
'initializers' => array(
'Zend\Db\Adapter' => function($instance, $sm) {
if ($instance instanceof \Zend\Db\Adapter\AdapterAwareInterface) {
$instance->setDbAdapter($sm->get('Zend\Db\Adapter\Adapter'));
}
},
),
);
另一种方法是创建一个MapperAbstractServiceFactory
,这个答案 -> ZF2 依赖注入在父项中描述了您可能如何做到这一点。