ZF2配置注入还是不?

时间:2013-02-12 22:50:20

标签: configuration dependency-injection zend-framework2

我已经搜索了很多内容并尽可能多地阅读了这个主题,但我无法在任何地方找到我的问题的直接答案。我的ZF2应用程序包含大约7个不同的模块。其中5个模块需要访问相同的数据库配置。应用程序本身有一个包含大约124个不同表的数据库。所以这里的想法是找到适当的解决方案来考虑设置编写最少量的代码。

我要做的是创建一个与DB交互的特定类。将业务逻辑保存在模块中并记下控制器,以使一切更抽象,更易于维护。我的意思是控制器X应该能够创建一个新的实例(Application \ Model \ DBInterface)并使用模型函数来执行插入删除更新连接选择等等。我想这样做的原因是所有安装的模块都可以使用相同的接口,而无需在任何地方编写无限的DI语句。所以我需要的是一个示例,说明如何获取要传递给Application \ Model \ DBInterface dbConfig变量的DB(当前位于module.config.php + local.php(username / pw)中)的配置,以及如果可能的话,甚至可以从config初始化dbAdapter的实例。

或者,如果存在这种方式,我可能会从Application \ Model \ DBInterface获取配置。

如果上述两种方法都不可能,那么我总是可以通过读取数据库详细信息的ini文件并以这种方式实例化我的数据库适配器来回到旧的做事方式。

请记住,我不会在控制器中注入任何东西,因为控制器只是使用 $ db = new \ Application \ Model \ DBInterface()所以注入控制器不会根本没有意义。

有没有更好的方法来做到这一点/优化/我完全错了吗?任何人都可以分享一些细节。我已经花了太多时间在这上面,肯定需要帮助。

1 个答案:

答案 0 :(得分:4)

好的,所以@Ocramius让我知道我对initializers的误解是什么,并帮助我理解它。所以这是一个可能解决你的问题的解决方案。我对你的问题的理解是:

“如何为实现DbInterface的所有模型设置DbAdapter”。这就是你的方式:


第1步:为实现invokables的所有类创建DbInterface。为默认factory创建Zend\Db\Adapter\Adapter,然后为initializer

创建DbInterface

Module.php getServiceConfig()

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 正在使用top-level-configuration-array-key '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步:使用控制器中的ServiceLocator访问这些类

SomeController.php someAction()

$dbOne = $this->getServiceLocator()->get('application-model-one');
$dbTwo = $this->getServiceLocator()->get('application-model-two');
// Adapter will automatically be injected

从ServiceManager访问invokable时,将调用initializer。然后,初始值设定项将自动调用Zend\Db\Adapter\Adapter,然后从配置键'db'获取参数


您可以从the tutorial Application以及博客中获取更多信息 samsonasik: ServiceManager Cheat-Sheet