0

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

我想要做的是创建一个特定的类来与数据库交互。业务逻辑保存在模块中的位置,并注意控制器以使所有内容更加抽象且易于维护。我的意思是控制器 X 应该能够创建例如 (Application\Model\DBInterface) 的新实例并使用模型函数来执行插入删除更新连接选择等等。我想这样做的原因是,所有安装的模块都可以使用相同的接口,而不必到处编写无休止的 DI 语句。因此,我需要一个示例,说明如何将数据库的配置(当前在 module.config.php + local.php(username / pw) 内部)传递给 Application\Model\DBInterface dbConfig 变量,

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

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

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

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

4

1 回答 1

4

好的,所以@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

于 2013-02-13T07:56:20.817 回答