2

我正在创建管理数据库实体的抽象模型 - 我已经有EntityAbstract,EntitySetAbstractManagerAbstract模型。在我的ManagerAbstract模型中,我需要一个Zend/Db/Adapter实例来创建一个Zend\Db\TableGateway如何从模型中获取Zend Db Adapter实例? (ZF2)

我该如何将适配器的主要实例拉到我的ManagerAbstract?在ZF1中,我可以用Zend_Registry来实现这一点。

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

谢谢!

回答

7

使用依赖注入容器Zend\DiZfcUser项目可以解决这个问题,如果你想在一些工作代码中寻找答案的话。

另外,基本的方法是这样的(未测试的代码!):

首先:配置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\''), 
        ), 
       ), 
      ), 
     ), 
    ), 
); 

其次,你的模块的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... 
    ) 
); 

最后,确保你的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 
} 

注意,使用任何的子类,你需要通过DIC进行检索或注入映射到该服务,然后注入SERVIC e放入要使用它的控制器(或其他服务)中。

+0

哇,谢谢你的惊人答案!尽管如此,我仍然有一个我无法解决的问题。 '缺少Zend \ Db \ Adapter \ Adapter :: __构造参数驱动程序的实例/对象 - 可能是什么问题? – 2012-04-21 22:01:55

+0

这意味着DI配置在某个地方是错误的。可能在Zend \ Db \ Adapter \ Adapter的定义中 – 2012-04-22 17:26:37

相关问题