Magento2 - Le contrôleur personnalisé génère une erreur


12

J'ai créé un module montré dans ce post. Mais mon propre contrôleur ne fonctionne pas. J'ai ce message d'erreur:

Erreur récupérable: l'argument 1 transmis à MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct () doit être une instance de Magento \ Framework \ App \ Action \ Context, instance de Magento \ Framework \ ObjectManager \ ObjectManager donnée, appelée dans D : \ xampp \ htdocs \ magento2 \ vendor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php sur la ligne 97 et défini dans D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName. php en ligne 35

Voici mon code de contrôleur:

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

Voici les messages d'erreur après avoir supprimé le dossier 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 commente votre fonction __construct, puis vérifiez à nouveau. et supprimez également le dossier de génération de votre répertoire var magento
Shaheer Ali

Salut Shaheer, malheureusement, cela ne résout pas le problème.
ClassMP

avez-vous supprimé le dossier de génération?
Shaheer Ali

Vous voulez dire le dossier / var / generation? Comment le contenu du dossier de génération sera-t-il généré? Dois-je recompiler avec "magento setup: di: compile"?
ClassMP

oui je veux dire ça. M2 pré générer les fichiers d'usine au moment de l'exécution. Non, vous n'avez pas besoin de recompiler
Shaheer Ali

Réponses:


18

Après avoir déployé le module sur un nouvel environnement de développement CentOS, supprimez les dossiers var / di et var / generation et recompilez di, cela fonctionne. Avant cela, j'utilisais un environnement Win Xampp. Cela cause beaucoup de problèmes ...


2
Peut confirmer que cela fonctionne, c'est pénible que vous deviez faire cela chaque fois que vous ajoutez un nouvel itinéraire
Alex

1
Est-ce vraiment un problème CentOS uniquement?
Mir

2
@Mir ce n'est pas un problème de système d'exploitation. @Alex chaque fois que vous apportez des modifications à l'injection de dépendances, il vous suffit d'exécuter php bin/magento setup:di:compilecette commande fera tout.
Nahid

7

Je suis tombé sur le même problème. Après quelques heures de débogage inutile et de me cogner la tête contre le mur, j'ai trouvé une solution qui fonctionnait bien pour moi.

À la fin, j'ai renommé tous les noms de fichiers d'action et les noms de classe de camel-case ie

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

À:

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

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

Cela a-t-il quelque chose à voir avec la dernière version de Magento2? Je l'ai en cours d'exécution sur mon environnement local sans aucun problème, cependant lorsque j'exécute le compilateur, c'est quand il s'agit de ce problème.
awavi

Cela a quelque chose à voir avec l'environnement du serveur. D'après mon expérience, lorsque je développe un module sur Windows (ou Mac récemment), je n'ai pas de problème avec les noms de fichiers et les noms de classe camel-case, mais sous la plupart des distributions Linux, je rencontre ces problèmes, donc je trouve plus facile de nommez simplement les fichiers et les classes comme je l'ai mentionné plus tôt.
Zan Kolev

Je suis presque sûr que le problème est que Windows est faiblement tapé, ce qui signifie que «CheckUserName.php» est traité de la même manière que «Checkusername.php» dans Windows. Linux est cependant fortement tapé, ce qui signifie «CheckUserName.php» et «Checkusername.php» sont deux choses entièrement différentes. Je rencontre de temps en temps les mêmes problèmes parce que je fais mon développement sur Windows et mes tests sur CentOS.
Mike Levy

7

Depuis votre répertoire racine Magento, exécutez la commande suivante:

php bin/magento setup:di:compile

Cela compilera à nouveau l'injection de dépendance (DI) et votre problème disparaîtra.


J'ai exécuté cette commande avec succès, a-t-il déclaré, et elle a supprimé l'ensemble du panier, à la fois admin et frontend avec l'erreur ", échec de l'ouverture du flux: autorisation refusée dans / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend -file / File.php. Il y avait la même erreur dans admin et frontend
VectorVortec

Ensuite, j'ai exécuté la commande, encore une fois, et les deux parties du panier ont retrouvé leur comportement normal.
VectorVortec

0

Votre CheckUserName.phpfichier de contrôleur ressemble à ci-dessous

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

}

vider le cache.

après cela, vous pouvez accéder à votre contrôleur en utilisant l' URL ci-dessous

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

Remarque: mon_module est le nom de devant de mon module, vous pouvez remplacer votre nom de front ici.

voir ci-dessous pic Mon côté ça marche

entrez la description de l'image ici

faites-moi savoir si cela ne fonctionne pas.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.