Magento2 - Custom Controller lança erro

12

Eu criei um módulo mostrado neste post. Mas meu próprio controlador não funciona. Recebi esta mensagem de erro:

Erro recuperável: o argumento 1 passado para MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct () deve ser uma instância do Magento \ Framework \ App \ Action \ Context, instância do Magento \ Framework \ ObjectManager \ ObjectManager fornecida, chamada em D : \ xampp \ htdocs \ magento2 \ fornecedor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php na linha 97 e definido em D: \ xampp \ htdocs \ magento2 \ app \ código \ mp \ MyModule \ Controller \ Index \ CheckUserName. php na linha 35

Aqui está o código do meu 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";
    }    
}
 ?>

Aqui estão as mensagens de erro após excluir a pasta 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
fonte
1
@ Claas MP comente sua função __construct e verifique novamente. e também excluir a pasta geração do seu magento var dir
Shaheer Ali
Oi Shaheer, infelizmente, isso não resolve o problema.
precisa saber é
você excluiu a pasta de geração?
Shaheer Ali 14/01
Não. Você quer dizer a pasta / var / generation? Como o conteúdo da pasta de geração será gerado? Preciso recompilar com "magento setup: di: compile"?
precisa saber é
sim, eu quero dizer isso. M2 pré gera os arquivos de fábrica em tempo de execução. Não, você não precisa recompilar
Shaheer Ali

Respostas:

18

Após implantar o módulo em um novo ambiente de desenvolvimento do CentOS, remova as pastas var / di e var / generation e recompile di, ele funciona. Antes disso, usei um ambiente Win Xampp. Isso causa muitos problemas ...

ClassMP
fonte
2
Pode confirmar isso funciona, é uma dor que você tem que fazer isso sempre que adicionar uma nova rota
Alex
1
Este é realmente apenas um problema do CentOS?
Mir
2
@ Mir não é um problema do sistema operacional. @ Alex sempre que você faz algumas alterações na injeção de dependência, basta executar php bin/magento setup:di:compileeste comando para fazer tudo.
Nahid
7

Eu tive o mesmo problema. Após algumas horas de depuração inútil e batendo a cabeça na parede, eu vim com uma solução que funcionou bem para mim.

No final, renomeei todos os nomes de arquivos de ação e nomes de classe de camel-case.

A partir de:

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 {
...
}

Para:

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

class Checkusername extends \Magento\Framework\App\Action\Action {
...
}
Zan Kolev
fonte
Tem algo a ver com a versão mais recente do Magento2? Eu o tenho rodando no meu ambiente local sem problemas, no entanto, quando executo o compiler, é quando se trata desse problema.
awavi
Tem algo a ver com o ambiente do servidor. Pela minha experiência, quando desenvolvo um módulo no Windows (ou Mac recentemente), não tenho o problema com os nomes de arquivos e nomes de classes, mas na maioria das distribuições Linux eu encontro esses problemas, então acho mais fácil apenas nomeie os arquivos e classes como mencionei anteriormente.
Zan Kolev
Tenho certeza de que o problema é que o Windows está com uma digitação fraca, o que significa que 'CheckUserName.php' é tratado da mesma forma que 'Checkusername.php' no Windows. No entanto, o Linux é fortemente digitado, significando 'CheckUserName.php' e 'Checkusername.php' são duas coisas totalmente diferentes. Ocasionalmente, encontro os mesmos problemas porque desenvolvo no Windows e testo no CentOS.
Mike Levy
7

No diretório raiz do Magento, execute o seguinte comando:

php bin/magento setup:di:compile

Isso compilará a Injeção de Dependência (DI) novamente e seu problema desaparecerá.

Nahid
fonte
Executei esse comando com êxito, disse ele, e derrubou todo o carrinho de compras, tanto administrador quanto front-end, com o erro "falha ao abrir o fluxo: permissão negada em / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend -file / File.php.Ele teve o mesmo erro no admin e frontend
VectorVortec
Depois, executei o comando novamente e as duas partes do carrinho de compras voltaram ao seu comportamento normal.
VectorVortec
0

O CheckUserName.phparquivo do seu controlador se parece abaixo

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";
    }

}

limpe o cache.

Depois disso, você pode acessar seu controlador usando o URL abaixo

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

Nota: my_module é o nome da frente do meu módulo, você pode substituir seu nome aqui.

veja abaixo pic Meu lado está funcionando

insira a descrição da imagem aqui

deixe-me saber se não está funcionando.

Bojjaiah
fonte