Magento 2, диспетчер объектов передает другой объект, чем ожидалось, почему?

magento.stackexchange https://magento.stackexchange.com/questions/101456

Вопрос

Как раз в тот момент, когда я думаю, что понимаю диспетчер объектов 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top