Можете ли вы помочь мне лучше понять диспетчер объектов, чтобы избежать ошибок при его использовании?
Я работаю над изучением 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
Как я могу исправить эти ошибки? Кроме того, можете ли вы помочь мне лучше понять внедрение зависимостей конструктора диспетчера объектов, чтобы избежать подобных ошибок в будущем?
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
)
Должен решить вашу проблему