如何从模型中获取Zend\Db\Adapter实例?(ZF2)

Dvi*_*lay 2 php model-view-controller zend-framework zend-framework2

我正在创建用于管理数据库实体的抽象模型 - 我已经拥有EntityAbstract,EntitySetAbstract以及ManagerAbstract模型.在我的ManagerAbstract模型中,我需要一个Zend/Db/Adapter实例来创建一个Zend\Db\TableGateway.

我怎么能把适配器的主要实例拉到我的ManagerAbstract?在ZF1中,我可以通过Zend_Registry实现这一目标.

如果这不是在ZF2中做事的正确方法,我很想听到这种事情的正确方法.

谢谢!

Rob*_*len 7

使用依赖注入容器Zend\Di.如果你想在一些工作代码中找到它,ZfcUser项目会这样做.

或者,基本方法是这样的(代码未经测试!):

首先:配置DI以注入数据库连接信息:

配置/自动加载/ local.config.php:

<?php
return array(
    'di' => array(
        'instance' => array(
        'Zend\Db\Adapter\Adapter' => array(
                'parameters' => array(
                    'driver' => 'Zend\Db\Adapter\Driver\Pdo\Pdo',
                ),
            ),
            'Zend\Db\Adapter\Driver\Pdo\Pdo' => array(
                'parameters' => array(
                    'connection' => 'Zend\Db\Adapter\Driver\Pdo\Connection',
                ),
            ),
            'Zend\Db\Adapter\Driver\Pdo\Connection' => array(
                'parameters' => array(
                    'connectionInfo' => array(
                        'dsn'            => "mysql:dbname=mydatabasename;host=localhost",
                        'username'       => 'myusername',
                        'password'       => 'mypassword',
                        'driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\''),
                    ),
                ),
            ),
        ),
    ),
);
Run Code Online (Sandbox Code Playgroud)

其次,在模块的module.config.php文件中,将适配器注入映射器:

模块/我的/配置/ module.config.php:

<?php
return array(
    'di' => array(

            // some config info...

            'My\Model\ManagerAbstract' => array(
                'parameters' => array(
                    'adapter'  => 'Zend\Db\Adapter\Adapter',
                ),
            ),

            // more config info...
    )
);
Run Code Online (Sandbox Code Playgroud)

最后,确保您的ManagerAbstract类可以接收注入:

模块/我的/ src目录/我的/型号/ ManagerAbstract.php:

<?php
namespace My\Model;

use Zend\Db\Adapter\Adapter;
use Zend\Db\Adapter\AdapterAwareInterface;

abstract class ManagerAbstract implements AdapterAwareInterface 
{
    /**
     * @var Zend\Db\Adapter\Adapter
     */
    protected $adapter;

    // some code 

    public function setDbAdapter(Adapter $adapter)
    {
        $this->adapter = $adapter;
    }

    // some more code
}
Run Code Online (Sandbox Code Playgroud)

请注意,要使用任何子类,您需要通过DIC检索它或将映射器注入服务,然后将服务注入您要使用它的控制器(或其他服务).