如何从模型中获取ZendDbAdapter实例?(ZF2)


How to get ZendDbAdapter instance from within a Model? (ZF2)

我正在创建用于管理数据库实体的抽象模型 - 我已经有EntityAbstractEntitySetAbstractManagerAbstract模型。在我的管理器抽象模型中,我需要Zend/Db/Adapter实例才能创建一个Zend'Db'TableGateway

如何将适配器的主实例拉到我的ManagerAbstract?在 ZF1 中,我本可以用Zend_Registry实现这一目标。

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

谢谢!

使用依赖注入容器,Zend'Di 。如果您想浏览一些工作代码,ZfcUser 项目会这样做。

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

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

config/

autoload/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'''),
                    ),
                ),
            ),
        ),
    ),
);

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

module/My/config

/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...
    )
);

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

module/My/

src/My/Model/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
}

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