Magento 2, диспетчер объектов передает другой объект, чем ожидалось, почему?
-
28-09-2020 - |
Вопрос
Как раз в тот момент, когда я думаю, что понимаю диспетчер объектов Magento 2 и внедрение зависимостей, происходит что-то, чего я не понимаю.Мне кажется, я прохожу мимо context
англ. pagefactory
возражает, но Magento говорит, что это не так.Второй вариант кажется неправильным.
Recoverable Error: Argument 2 passed to Demo\Hello\Controller\Adminhtml\Order\MassPrint::__construct() must be an instance of Magento\Framework\View\Result\PageFactory, instance of Magento\Framework\App\ResourceConnection given, called in
Контроллер:
<?php
namespace Demo\Hello\Controller\Adminhtml\Order;
use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
class MassPrint extends \Magento\Backend\App\Action {
public function __construct(Context $context, PageFactory $pageFactory) {
parent::__construct($context);
}
}
Он понимает тип, намекающий так, как я хочу:
must be an instance of Magento\Framework\View\Result\PageFactory
Но это проходит
instance of Magento\Framework\App\ResourceConnection given
Почему это происходит?С Magento происходит какая-то магия, которую я не понимаю (пока).
Решение
TL;DR
Если вы видите ошибку с Interceptor.php
обязательно опорожните /var/generation/
прежде чем вы посмотрите дальше.Это сэкономит вам массу времени.
Объяснение
После некоторого тестирования я нашел первопричину.При первом запуске пользовательского контроллера Magento автоматически генерирует файлы.Пока все хорошо.В моем случае только один.Это жизнь в var\generation\
Полный путь в этом примере был бы следующим var\generation\Demo\Hello\Controller\Adminhtml\Order\MassPrint\Interceptor.php
.
Этот класс расширяет ваш пользовательский контроллер.Поэтому, естественно, он вызывает родительский конструктор в своем собственном конструкторе.Поэтому, если вы вносите изменения в свой конструктор контроллера, этот файл должен быть восстановлен для выполнения вашего нового кода.Если вы этого не сделаете, это приведет к нежелательным результатам.Поэтому не забудьте, по крайней мере, удалить класс Interceptor для этого контроллера.Проще было бы очистить весь director, чтобы Magento восстановил все файлы, соответствующие вашему новому коду.
rm -rf var/generation/*
На самом деле magento дает очень хорошую подсказку, где искать в последней части сообщения об ошибке.
called in /var/generation/Demo/Hello/Controller/Adminhtml/Order/MassPrint/Interceptor.php on line 15