Magento2: error de lanzamiento del controlador personalizado

12

Creé un módulo que se muestra en esta publicación. Pero mi propio controlador no funciona. Tengo este mensaje de error:

Error recuperable: el argumento 1 pasado a MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct () debe ser una instancia de Magento \ Framework \ App \ Action \ Context, instancia de Magento \ Framework \ ObjectManager \ ObjectManager dada, llamada en D : \ xampp \ htdocs \ magento2 \ vendor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php en la línea 97 y definido en D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName. php en línea 35

Aquí está mi código de controlador:

<?php
namespace MP\MyModule\Controller\Index;

class CheckUserName extends \Magento\Framework\App\Action\Action
{
    protected $_logger;
    protected $_objectManager;
    protected $_request;

/*
            \Psr\Log\LoggerInterface $logger, //log injection
            \Magento\Framework\App\Request\Http $request

        $this->_logger = $logger;

        $this->_logger->debug('CheckUserName_Constructor_Begin');

        $this->_request = $request;

        $this->_logger->debug('CheckUserName_Constructor_End');     


        */  

        /**
     * @var \Magento\Framework\View\Result\PageFactory
     */
    protected $resultPageFactory;

    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param \Magento\Framework\View\Result\PageFactory resultPageFactory
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory
    )
    {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }

    public function execute()
    {
        echo "Hello from Checkusername";
    }    
}
 ?>

Aquí están los mensajes de error después de eliminar la carpeta var / generation:

Warning: ltrim() expects parameter 1 to be string, object given in D:\xampp\htdocs\magento2\vendor\magento\framework\Code\Generator\EntityAbstract.php on line 152

Notice: Uninitialized string offset: 0 in D:\xampp\htdocs\magento2\vendor\magento\framework\Autoload\ClassLoaderWrapper.php on line 81

Notice: Uninitialized string offset: 0 in D:\xampp\htdocs\magento2\vendor\composer\ClassLoader.php on line 317

Notice: Uninitialized string offset: 0 in D:\xampp\htdocs\magento2\vendor\composer\ClassLoader.php on line 349 exception 'Magento\Framework\Exception\LocalizedException' with message 'Source class "" for "Magento\Framework\App\Response\Http\Interceptor" generation does not exist.' in D:\xampp\htdocs\magento2\vendor\magento\framework\Code\Generator.php:171 Stack trace: #0 D:\xampp\htdocs\magento2\vendor\magento\framework\Code\Generator.php(100): Magento\Framework\Code\Generator->tryToLoadSourceClass('Magento\\Framewo...', Object(Magento\Framework\Interception\Code\Generator\Interceptor))
#1 D:\xampp\htdocs\magento2\vendor\magento\framework\Code\Generator\Autoloader.php(35): Magento\Framework\Code\Generator->generateClass('Magento\\Framewo...')
#2 [internal function]: Magento\Framework\Code\Generator\Autoloader->load('Magento\\Framewo...')
#3 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\Factory\AbstractFactory.php(105): spl_autoload_call('Magento\\Framewo...')
#4 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\Factory\Compiled.php(88): Magento\Framework\ObjectManager\Factory\AbstractFactory->createObject('Magento\\Framewo...', Array)
#5 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\Factory\Compiled.php(130): Magento\Framework\ObjectManager\Factory\Compiled->create('Magento\\Framewo...')
#6 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\Factory\Compiled.php(67): Magento\Framework\ObjectManager\Factory\Compiled->get('Magento\\Framewo...')
#7 D:\xampp\htdocs\magento2\vendor\magento\framework\ObjectManager\ObjectManager.php(57): Magento\Framework\ObjectManager\Factory\Compiled->create('Magento\\Framewo...', Array)
#8 D:\xampp\htdocs\magento2\vendor\magento\framework\App\Bootstrap.php(233): Magento\Framework\ObjectManager\ObjectManager->create('Magento\\Framewo...', Array)
#9 D:\xampp\htdocs\magento2\index.php(38): Magento\Framework\App\Bootstrap->createApplication('Magento\\Framewo...')
#10 {main}
ClassMP
fuente
1
@Claas MP comenta tu función __construct y luego vuelve a verificar. y también elimine la carpeta de generación de su directorio de var magento
Shaheer Ali
Hola Shaheer desafortunadamente eso no soluciona el problema.
ClassMP
¿eliminaste la carpeta de generación?
Shaheer Ali
No. ¿Te refieres a la carpeta / var / generation? ¿Cómo se generará el contenido en la carpeta de generación? ¿Necesito volver a compilar con "magento setup: di: compile"?
ClassMP
Sí, quiero decir eso. M2 pre genera los archivos de fábrica en tiempo de ejecución. No, no necesitas recompilar
Shaheer Ali

Respuestas:

18

Después de implementar el módulo en un nuevo entorno de desarrollo CentOS, elimine las carpetas var / di y var / generation y recompile di, funciona. Antes de eso, utilicé un entorno Win Xampp. Eso causa muchos problemas ...

ClassMP
fuente
2
Puede confirmar que esto funciona, es una pena que tengas que hacer eso cada vez que agregues una nueva ruta
Alex
1
¿Es realmente un problema único de CentOS?
Mir
2
@Mir esto no es un problema del sistema operativo. @Alex cada vez que realiza algunos cambios en la inyección de dependencia, solo tiene que ejecutar php bin/magento setup:di:compileeste comando hará todo.
Nahid
7

Me encontré con el mismo problema. Después de algunas horas de depuración sin sentido y golpeando mi cabeza contra la pared, encontré una solución que funcionó bien para mí.

Al final, cambié el nombre de todos los nombres de archivos de acción y nombres de clase de camel-case, es decir

Desde:

D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName.php

<?php
namespace MP\MyModule\Controller\Index;

class CheckUserName extends \Magento\Framework\App\Action\Action {
...
}

A:

D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ Checkusername.php

class Checkusername extends \Magento\Framework\App\Action\Action {
...
}
Zan Kolev
fuente
¿Tiene algo que ver con la última versión de Magento2? Lo tengo ejecutándose en mi entorno local sin problemas, sin embargo, cuando ejecuto el compilador es cuando se trata de ese problema.
awavi
Tiene algo que ver con el entorno del servidor. Según mi experiencia, cuando desarrollo un módulo en Windows (o Mac últimamente) no tengo el problema con los nombres de archivo y nombres de clase de camello, pero en la mayoría de las distribuciones de Linux me encuentro con estos problemas, así que me resulta más fácil solo nombra los archivos y clases como mencioné anteriormente.
Zan Kolev
Estoy bastante seguro de que el problema es que Windows está mal escrito, lo que significa que 'CheckUserName.php' se trata de la misma manera que 'Checkusername.php' en Windows. Sin embargo, Linux está fuertemente tipado, lo que significa que 'CheckUserName.php' y 'Checkusername.php' son dos cosas completamente diferentes. Me encuentro con los mismos problemas de vez en cuando porque desarrollo en Windows y pruebo en CentOS.
Mike Levy el
7

Desde su directorio raíz de Magento ejecute el siguiente comando:

php bin/magento setup:di:compile

Esto compilará la Inyección de dependencia (DI) nuevamente y su problema desaparecerá.

Nahid
fuente
Ejecuté ese comando con éxito, dijo, y eliminó todo el carrito de compras, tanto el administrador como la interfaz con el error, "no se pudo abrir la secuencia: Permiso denegado en / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend -file / File.php. Tenía el mismo error en admin y frontend.
VectorVortec
Luego ejecuté el comando, nuevamente, y ambas partes del carrito de compras volvieron a su comportamiento normal.
VectorVortec
0

Su CheckUserName.phparchivo de controlador se ve a continuación

MP / MyModule / Controller / Index / CheckUserName.php

<?php
namespace MP\MyModule\Controller\Index;

class CheckUserName extends \Magento\Framework\App\Action\Action
{

    /**
     * @var \Magento\Framework\View\Result\PageFactory
     */
    protected $resultPageFactory;

    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param \Magento\Framework\View\Result\PageFactory resultPageFactory
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory
    )
    {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }

    public function execute()
    {
        echo "Hello from Check username";
    }

}

borrar el caché

después de eso, puede acceder a su controlador utilizando la siguiente URL

http://192.168.0.52/m2ee/my_module/index/CheckUserName/ o http://192.168.0.52/m2ee/index.php/my_module/index/CheckUserName/

Nota: my_module es el nombre del frente de mi módulo, aquí puede reemplazar su nombre del frente.

ver foto debajo Mi lado está funcionando

ingrese la descripción de la imagen aquí

Avísame si no funciona.

Bojjaiah
fuente