Magento2 - Custom Controller zgłasza błąd

12

Utworzyłem moduł pokazany w tym poście. Ale mój własny kontroler nie działa. Mam ten komunikat o błędzie:

Błąd możliwy do odzyskania: Argument 1 przekazany do MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct () musi być instancją Magento \ Framework \ App \ Action \ Context, instancją Magento \ Framework \ ObjectManager \ ObjectManager podaną, wywoływaną w D : \ xampp \ htdocs \ magento2 \ vendor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php w linii 97 i zdefiniowany w D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName. php na linii 35

Oto mój kod kontrolera:

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

Oto komunikaty o błędach po usunięciu folderu 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
źródło
1
@Claas MP skomentuj swoją funkcję __construct, a następnie sprawdź ponownie. a także usuń folder generowania z twojego magento var dir
Shaheer Ali
Cześć Shaheer, niestety to nie rozwiązuje problemu.
ClassMP
usunąłeś folder generowania?
Shaheer Ali
Nie. Czy masz na myśli folder / var / generation? Jak będzie generowana zawartość w folderze generowania? Czy muszę rekompilować za pomocą „Magento setup: di: compile”?
ClassMP
tak, mam na myśli to. M2 wstępnie generuje pliki fabryczne w czasie wykonywania. Nie, nie musisz ponownie kompilować
Shaheer Ali

Odpowiedzi:

18

Po wdrożeniu modułu w nowym środowisku programistycznym CentOS, usuń foldery var / di i var / generation i ponownie skompiluj di, działa. Wcześniej korzystałem ze środowiska Win Xampp. To powoduje wiele problemów ...

ClassMP
źródło
2
Potwierdzam, że to działa, to ból, że musisz to zrobić za każdym razem, gdy dodajesz nową trasę
Alex
1
Czy to naprawdę problem tylko z CentOS?
Mir
2
@Mir to nie jest problem z systemem operacyjnym. @Alex za każdym razem, gdy wprowadzasz jakieś zmiany we wstrzykiwaniu zależności, wystarczy uruchomić php bin/magento setup:di:compileto polecenie, aby zrobić wszystko.
Nahid
7

Natrafiłem na ten sam problem. Po kilku godzinach bezcelowego debugowania i uderzania głową o ścianę wymyśliłem rozwiązanie, które działało dla mnie dobrze.

Na koniec przemianowałem wszystkie nazwy plików akcji i nazwy klas z wielbłąda, tj

Z:

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

Do:

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

class Checkusername extends \Magento\Framework\App\Action\Action {
...
}
Zan Kolev
źródło
Czy ma to coś wspólnego z najnowszą wersją Magento2? Mam go uruchomionego w moim lokalnym środowisku bez żadnych problemów, jednak kiedy uruchamiam de kompilator, to jest ten problem.
awavi
Ma to coś wspólnego ze środowiskiem serwerowym. Z mojego doświadczenia wynika, że ​​gdy ostatnio tworzę moduł w systemie Windows (lub Mac), nie mam problemu z nazwami plików wielbłądów i nazw klas, ale w większości dystrybucji Linuksa napotykam te problemy, więc łatwiej mi po prostu nazwij pliki i klasy, jak wspomniałem wcześniej.
Zan Kolev
Jestem prawie pewien, że problem polega na tym, że system Windows jest źle napisany, co oznacza, że ​​„CheckUserName.php” jest traktowany tak samo jak „Checkusername.php” w systemie Windows. Linux jest jednak mocno napisany, co oznacza, że ​​„CheckUserName.php” i „Checkusername.php” to dwie zupełnie różne rzeczy. Od czasu do czasu napotykam te same problemy, ponieważ rozwijam się w systemie Windows i testuję na CentOS.
Mike Levy
7

Z katalogu głównego Magento uruchom następującą komendę:

php bin/magento setup:di:compile

Spowoduje to ponowne skompilowanie Dependency Injection (DI) i problem zniknie.

Nahid
źródło
Uruchomiłem tę komendę, powiedziano, i usunęłem cały koszyk zarówno administratora, jak i frontonu z błędem, „nie udało się otworzyć strumienia: Odmowa dostępu w / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend -plik / plik.php. Miał ten sam błąd w
adminie
Potem ponownie uruchomiłem polecenie i obie części koszyka powróciły do ​​normalnego zachowania.
VectorVortec,
0

Twój CheckUserName.phpplik kontrolera wygląda jak poniżej

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

}

wyczyść pamięć podręczną.

potem możesz uzyskać dostęp do kontrolera, używając poniższego adresu URL

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

Uwaga: mój_moduł to nazwa frontowa mojego modułu, którą możesz zastąpić tutaj.

patrz poniżej zdjęcie Moja strona działa

wprowadź opis zdjęcia tutaj

daj mi znać, jeśli to nie działa.

Bojjaiah
źródło