Можете ли вы помочь мне лучше понять диспетчер объектов, чтобы избежать ошибок при его использовании?


Я работаю над изучением Magento 2, и у меня возникли проблемы с автоматическим внедрением зависимостей конструктора в мою коллекцию моделей ресурсов.

Вот мой код:

namespace TylerSchade\Contacts\Model\ResourceModel\Contact;

use \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection;

class Collection extends AbstractCollection
{
    protected $session;

    public function __construct(
        \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
        \Psr\Log\LoggerInterface $logger,
        \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
        \Magento\Framework\Event\ManagerInterface $eventManager,
        \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource,
        \Magento\Customer\Model\Session $session,
        \Magento\Framework\DB\Adapter\AdapterInterface $connection = null
    ) {
        $this->session = $session;

        parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
    }

    protected function _construct()
    {
        $this->_init('TylerSchade\Contacts\Model\Contact', 'TylerSchade\Contacts\Model\ResourceModel\Contact');
    }

    public function addCustomerFilter()
    {
        $this->addFieldToFilter('customer_id', $this->session->getCustomerId());
    }
}

Когда я запускаю код, загружающий коллекцию, я получаю следующую ошибку:

Fatal error: Uncaught Error: Cannot instantiate interface Magento\Framework\DB\Adapter\AdapterInterface in /var/www/magentotwo/magentotwo/vendor/magento/framework/ObjectManager/Factory/Dynamic/Developer.php on line 73

Я попытался изменить порядок параметров и указать параметр, который вызывает ошибку, по умолчанию равный нулю, потому что я видел это в основном коде, но это приводит к большему количеству ошибок. Я также попытался добавить di.xml файл, в котором указано предпочтение интерфейса Magento\Framework\DB\Adapter\Pdo\Mysql, думая, что, возможно, проблема в том, что я не указал предпочтение интерфейса, но затем я получаю следующие ошибки:

2 exception(s):
Exception #0 (InvalidArgumentException): Configuration array must have a key for 'dbname' that names the database instance
Exception #1 (Zend_Db_Adapter_Exception): Configuration array must have a key for 'dbname' that names the database instance

Как я могу исправить эти ошибки? Кроме того, можете ли вы помочь мне лучше понять внедрение зависимостей конструктора диспетчера объектов, чтобы избежать подобных ошибок в будущем?

Author: tjons, 2016-10-21

1 answers

Вы должны объявить свои параметры перед необязательным родительским классом.

Просто обратите внимание на родительский конструктор:

public function __construct(
    \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
    \Psr\Log\LoggerInterface $logger,
    \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
    \Magento\Framework\Event\ManagerInterface $eventManager,
    \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
    \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
)

$resource параметр необязателен, но вы делаете его обязательным.

Измените свой конструктор на

public function __construct(
    \Magento\Framework\Data\Collection\EntityFactoryInterface $entityFactory,
    \Psr\Log\LoggerInterface $logger,
    \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy,
    \Magento\Framework\Event\ManagerInterface $eventManager,
    \Magento\Customer\Model\Session $session,
    \Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
    \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
)

Должен решить вашу проблему

 2
Author: KAndy, 2016-10-21 05:55:22