Magento2 - Custom Controller löst einen Fehler aus

12

Ich habe ein Modul erstellt, das in diesem Beitrag gezeigt wird. Aber mein eigener Controller funktioniert nicht. Ich habe folgende Fehlermeldung erhalten:

Wiederherstellbarer Fehler: Argument 1, das an MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct () übergeben wird, muss eine Instanz von Magento \ Framework \ App \ Action \ Context sein, die in D aufgerufen wird : \ xampp \ htdocs \ magento2 \ vendor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php in Zeile 97 und definiert in D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName. PHP in Zeile 35

Hier ist mein Controller-Code:

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

Hier sind die Fehlermeldungen nach dem Löschen des Ordners 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
quelle
1
@Claas MP kommentiere deine __construct-Funktion und überprüfe sie erneut. und löschen Sie auch den Generierungsordner von Ihrem Magento Var Dir
Shaheer Ali
Hallo Shaheer, das behebt das Problem leider nicht.
ClassMP
Haben Sie den Generierungsordner gelöscht?
Shaheer Ali
Meinen Sie den Ordner / var / generation? Wie wird der Inhalt im Generierungsordner generiert? Muss ich mit "magento setup: di: compile" neu kompilieren?
ClassMP
Ja, das meine ich. M2 generiert vorab die Factory-Dateien zur Laufzeit. Nein, Sie müssen nicht neu kompilieren
Shaheer Ali

Antworten:

18

Entfernen Sie nach dem Bereitstellen des Moduls in einer neuen CentOS-Entwicklungsumgebung die Ordner var / di und var / generation und kompilieren Sie di neu, es funktioniert. Davor habe ich eine Win Xampp-Umgebung verwendet. Das verursacht eine Menge Ärger ...

ClassMP
quelle
2
Kann bestätigen, dass dies funktioniert, es ist ein Schmerz, den Sie tun müssen, wenn Sie eine neue Route hinzufügen
Alex
1
Ist das wirklich ein CentOS-Problem?
Mir
2
@Mir das ist kein Betriebssystemproblem. @Alex Wenn Sie Änderungen an der Abhängigkeitsinjektion vornehmen, müssen Sie nur php bin/magento setup:di:compilediesen Befehl ausführen , um alles zu erledigen.
Nahid
7

Ich bin auf dasselbe Problem gestoßen. Nach ein paar Stunden sinnlosen Debuggens und Hämmerns kam ich auf eine Lösung, die für mich gut funktionierte.

Am Ende habe ich alle Aktionsdateinamen und Klassennamen von camel-case umbenannt

Von:

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

Zu:

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

class Checkusername extends \Magento\Framework\App\Action\Action {
...
}
Zan Kolev
quelle
Hat es etwas mit der neuesten Version von Magento2 zu tun? Ich habe es auf meiner lokalen Umgebung ohne Probleme ausgeführt, aber wenn ich de Compiler ausführen, ist, wenn es um dieses Problem geht.
Awavi
Es hat etwas mit der Serverumgebung zu tun. Aus meiner Erfahrung, wenn ich ein Modul unter Windows (oder Mac in letzter Zeit) entwickle, habe ich kein Problem mit den Dateinamen und Klassennamen der Kamel-Fälle, aber unter den meisten Linux-Distributionen stoße ich auf diese Probleme, so dass ich es leichter finde Benennen Sie einfach die Dateien und Klassen, wie ich zuvor erwähnt habe.
Zan Kolev
Ich bin mir ziemlich sicher, dass das Problem darin besteht, dass Windows schwach geschrieben ist, was bedeutet, dass "CheckUserName.php" in Windows genauso behandelt wird wie "Checkusername.php". Linux ist jedoch stark typisiert, was bedeutet, dass 'CheckUserName.php' und 'Checkusername.php' zwei völlig verschiedene Dinge sind. Ich habe von Zeit zu Zeit die gleichen Probleme, weil ich unter Windows entwickle und unter CentOS teste.
Mike Levy
7

Führen Sie in Ihrem Magento-Stammverzeichnis den folgenden Befehl aus:

php bin/magento setup:di:compile

Dadurch wird die Abhängigkeitsinjektion (DI) erneut kompiliert und Ihr Problem wird behoben.

Nahid
quelle
Ich habe diesen Befehl erfolgreich ausgeführt und sowohl den Administrator als auch das Frontend des gesamten Einkaufswagens mit dem Fehler "Fehler beim Öffnen des Streams: Berechtigung verweigert in / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend" -file / File.php. Es hatte den gleichen Fehler in Admin und Frontend.
VectorVortec
Dann führte ich den Befehl erneut aus und beide Teile des Einkaufswagens kehrten zu ihrem normalen Verhalten zurück.
VectorVortec
0

Ihre Controller- CheckUserName.phpDatei sieht wie folgt aus

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

}

Cache leeren.

Danach können Sie über die folgende URL auf Ihren Controller zugreifen

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

Hinweis: my_module ist mein Modul-Frontname. Sie können Ihren Frontnamen hier ersetzen.

siehe Bild unten Meine Seite es funktioniert

Bildbeschreibung hier eingeben

Lass es mich wissen, wenn es nicht funktioniert.

Bojjaiah
quelle