Вопрос по zend-framework2, model-view-controller, zend-framework, php – Как получить экземпляр Zend \ Db \ Adapter из Модели? (ZF2)

2

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

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

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

Спасибо!

Ваш Ответ

1   ответ
7

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 или внедрить маппер в сервис, а затем внедрить сервис в контроллер (или другой сервис), где вы хотите его использовать.

Вау, спасибо за удивительный ответ! хотя у меня все еще есть проблема, которую я не смог бы решить.Missing instance/object for parameter driver for Zend\Db\Adapter\Adapter::__construct - В чем может быть проблема? Dvir Azulay
Это подразумевает, что конфигурация DI где-то неверна. Вероятно, в рамках определения Zend \ Db \ Adapter \ Adapter

Похожие вопросы