Я создаю абстрактные модели для управления объектами базы данных. У меня уже есть EntityAbstract
, EntitySetAbstract
и модели ManagerAbstract
. В моей модели ManagerAbstract мне нужен экземпляр Zend/Db/Adapter
, чтобы создать Zend\Db\TableGateway
.
Как я могу вытащить основной экземпляр адаптера в свой ManagerAbstract
? В ZF1 я мог бы добиться этого с помощью Zend_Registry.
Если это неправильный способ сделать что-то в ZF2, я хотел бы услышать правильный путь к подобным вещам.
Благодаря!
Используйте контейнер для инъекций зависимостей, 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
вашего модуля 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 / 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 или ввести в службу картографа, а затем ввести службу в контроллер (или другую службу), где вы хотите его использовать.