Magento2 - Il controller personalizzato genera un errore


12

Ho creato un modulo mostrato in questo post. Ma il mio controller non funziona. Ho questo messaggio di errore:

Errore recuperabile: l'argomento 1 passato a MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct () deve essere un'istanza di Magento \ Framework \ App \ Action \ Context, istanza di Magento \ Framework \ ObjectManager \ ObjectManager fornita, chiamata in D : \ xampp \ htdocs \ magento2 \ vendor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php sulla riga 97 e definito in D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName. php sulla linea 35

Ecco il mio codice controller:

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

Ecco i messaggi di errore dopo aver eliminato la cartella 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}

1
@Claas MP commenta la tua funzione __construct e quindi ricontrolla. ed elimina anche la cartella di generazione dal tuo magento var dir
Shaheer Ali

Ciao Shaheer purtroppo non risolve il problema.
ClassMP

hai cancellato la cartella di generazione?
Shaheer Ali,

No. Intendi la cartella / var / generation? Come verrà generato il contenuto nella cartella di generazione? Devo ricompilare con "magento setup: di: compile"?
ClassMP

si intendo quello. M2 pre genera i file di fabbrica in fase di esecuzione. No, non è necessario ricompilare
Shaheer Ali,

Risposte:


18

Dopo aver distribuito il modulo su un nuovo ambiente di sviluppo CentOS, rimuovere le cartelle var / di e var / generation e ricompilare di, funziona. Prima di allora ho usato un ambiente Win Xampp. Ciò causa molti problemi ...


2
Può confermare che funziona, è un dolore che devi farlo ogni volta che aggiungi una nuova rotta
Alex

1
È davvero solo un problema di CentOS?
Mir,

2
@Mir questo non è un problema del sistema operativo. @Alex ogni volta che apporti alcune modifiche all'iniezione di dipendenze, devi solo eseguire php bin/magento setup:di:compilequesto comando farà tutto.
Nahid,

7

Ho riscontrato lo stesso problema. Dopo alcune ore di inutile debug e sbattere la testa dal muro, ho trovato una soluzione che ha funzionato bene per me.

Alla fine ho rinominato tutti i nomi dei file di azione e i nomi delle classi da camel-case cioè

A partire dal:

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

Per:

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

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

Ha qualcosa a che fare con l'ultima versione di Magento2? L'ho eseguito sul mio ambiente locale senza problemi, tuttavia quando eseguo il compilatore è quando si tratta di quel problema.
Awavi,

Ha qualcosa a che fare con l'ambiente del server. Dalla mia esperienza, quando sviluppo un modulo su Windows (o Mac di recente) non ho il problema con i nomi dei file e i nomi delle classi dei casi di cammello, ma nella maggior parte delle distribuzioni Linux mi imbatto in questi problemi, quindi trovo più facile basta nominare i file e le classi come ho già detto in precedenza.
Zan Kolev,

Sono abbastanza sicuro che il problema sia che Windows è tipizzato debolmente, il che significa che "CheckUserName.php" è trattato come "Checkusername.php" in Windows. Linux tuttavia è fortemente tipizzato, il che significa che "CheckUserName.php" e "Checkusername.php" sono due cose completamente diverse. Di tanto in tanto mi imbatto negli stessi problemi perché eseguo il mio sviluppo su Windows e test su CentOS.
Mike Levy,

7

Dalla directory principale di Magento, eseguire il comando seguente:

php bin/magento setup:di:compile

In questo modo verrà compilata nuovamente la Dependency Injection (DI) e il problema scomparirà.


Ho eseguito quel comando con successo, ha detto, e ha eliminato l'intero carrello sia con admin che con frontend con l'errore "Impossibile aprire il flusso: autorizzazione negata in / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend -file / File.php. Aveva lo stesso errore in admin e frontend
VectorVortec,

Quindi ho eseguito nuovamente il comando ed entrambe le parti del carrello sono tornate al loro normale comportamento.
VectorVortec,

0

Il CheckUserName.phpfile del controller è simile al seguente

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

}

svuota la cache.

successivamente è possibile accedere al controller utilizzando l' URL seguente

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 è il nome del mio modulo, qui puoi sostituire il tuo nome.

vedi sotto la foto La mia parte funziona

inserisci qui la descrizione dell'immagine

fammi sapere se non funziona.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.