Magento 2, el administrador de objetos pasa otro objeto del esperado, ¿por qué?
-
28-09-2020 - |
Pregunta
Justo cuando creo que entiendo el administrador de objetos de Magento 2 y la inyección de dependencia, sucede algo que no entiendo.creo que estoy pasando context
es pagefactory
objetos pero Magento dice que no.El segundo parece incorrecto.
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
El controlador:
<?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);
}
}
Entiende el tipo de insinuación como quiero:
must be an instance of Magento\Framework\View\Result\PageFactory
pero esta pasando
instance of Magento\Framework\App\ResourceConnection given
¿Por qué es esto?Hay algo de magia con Magento que no entiendo (todavía).
Solución
TL;DR
Si ve un error con Interceptor.php
asegúrese de vaciar /var/generation/
antes de mirar más allá.Le ahorrará mucho tiempo.
Explicación
Después de algunas pruebas encontré la causa subyacente.Al ejecutar un controlador personalizado por primera vez, Magento genera archivos automáticamente.Hasta ahora, todo bien.En mi caso solo uno.esta viviendo en var\generation\
La ruta completa en este ejemplo sería var\generation\Demo\Hello\Controller\Adminhtml\Order\MassPrint\Interceptor.php
.
Esta clase amplía su controlador personalizado.Entonces, naturalmente, está llamando al constuctor padre en su propio constuctor.Entonces, si realiza cambios en el constructor de su controlador, este archivo debe regenerarse para que coincida con su nuevo código.Si no lo hace, producirá resultados no deseados.Así que asegúrese de eliminar al menos la clase Interceptor para ese controlador.Más fácil sería vaciar todo el director para que Magento regenere todos los archivos que coincidan con su nuevo código.
rm -rf var/generation/*
En realidad, magento da una muy buena pista sobre dónde buscar en la última parte del mensaje de error.
called in /var/generation/Demo/Hello/Controller/Adminhtml/Order/MassPrint/Interceptor.php on line 15