2

Я создаю абстрактные модели для управления объектами базы данных. У меня уже есть EntityAbstract, EntitySetAbstract и модели ManagerAbstract. В моей модели ManagerAbstract мне нужен экземпляр Zend/Db/Adapter, чтобы создать Zend\Db\TableGateway.Как получить экземпляр Zend Db Adapter из модели? (ZF2)

Как я могу вытащить основной экземпляр адаптера на мой ManagerAbstract? В ZF1 я мог бы добиться этого с помощью Zend_Registry.

Если это неправильный способ делать вещи в ZF2, я хотел бы услышать правильный путь к подобным вещам.

Спасибо!

ответ

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

во-вторых, в module.config.php файле вашего модуля, впрыснуть адаптер в картографа:

модуль/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 может получить инъекцию:

модуль/My/SRC/My/Модель/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 или впрыскивать картографа в службу, а затем впрыскивают-услуги e в контроллер (или другую службу), где вы хотите его использовать.

+0

Ничего себе, спасибо за удивительный ответ! хотя, у меня все еще есть проблема, которую я не мог понять. 'Отсутствует экземпляр/объект для драйвера параметров для Zend \ Db \ Adapter \ Adapter :: __ construct' - что может быть проблемой? –

+0

Это означает, что конфигурация DI где-то не так. Возможно, в определении Zend \ Db \ Adapter \ Adapter –

 Смежные вопросы

  • Нет связанных вопросов^_^