Magento2 - Пользовательский контроллер выдает ошибку

12

Я создал модуль, показанный в этом посте. Но мой собственный контроллер не работает. У меня есть это сообщение об ошибке:

Исправимая ошибка: Аргумент 1, переданный в MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct (), должен быть экземпляром Magento \ Framework \ App \ Action \ Context, задан экземпляр Magento \ Framework \ ObjectManager \ ObjectManager, вызываемый в D : \ xampp \ htdocs \ magento2 \ vendor \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php в строке 97 и определяется в D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ Index \ CheckUserName. PHP на линии 35

Вот мой код контроллера:

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

Вот сообщения об ошибках после удаления папки 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
источник
1
@Claas MP прокомментирует вашу функцию __construct и затем проверьте еще раз. а также удалите папку генерации из вашего magento var dir
Shaheer Ali
Привет, Шахир, к сожалению, это не решает проблему.
ClassMP
ты удалил папку поколения?
Шахир Али
Нет. Вы имеете в виду папку / var / generation? Как будет создаваться контент в папке генерации? Нужно ли перекомпилировать с «magento setup: di: compile»?
ClassMP
да, я имею в виду это. M2 предварительно генерирует заводские файлы во время выполнения. Нет, вам не нужно перекомпилировать
Шахир Али

Ответы:

18

После развертывания модуля в новой среде разработки CentOS, удаления папок var / di и var / generation и перекомпиляции di, он работает. До этого я использовал среду Win Xampp. Это вызывает много проблем ...

ClassMP
источник
2
Могу подтвердить, что это работает, это боль, что вы должны делать это всякий раз, когда добавляете новый маршрут
Alex
1
Это действительно проблема CentOS?
Мир,
2
@ Мир, это не проблема ОС. @ Алекс всякий раз, когда вы вносите какие-либо изменения в внедрение зависимостей, вам просто нужно выполнить php bin/magento setup:di:compileэту команду, и все будет сделано.
Нахид
7

Я столкнулся с той же проблемой. После нескольких часов бессмысленной отладки и удара головой о стену, я нашел решение, которое хорошо сработало для меня.

В конце я переименовал все имена файлов действий и имена классов из Camel-Case, т.е.

Из:

D: \ XAMPP \ HTDOCS \ magento2 \ приложение \ код \ тр \ MyModule \ Controller \ Индекс \ CheckUserName.php

<?php
namespace MP\MyModule\Controller\Index;

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

Для того, чтобы:

D: \ XAMPP \ HTDOCS \ magento2 \ приложение \ код \ тр \ MyModule \ Controller \ Индекс \ Checkusername.php

class Checkusername extends \Magento\Framework\App\Action\Action {
...
}
Зан Колев
источник
Это как-то связано с последней версией Magento2? У меня он работает в моей локальной среде без проблем, однако, когда я запускаю де-компилятор, это когда дело доходит до этой проблемы.
Авави
Это как-то связано с серверной средой. Исходя из моего опыта, когда я разрабатываю модуль для Windows (или Mac в последнее время), у меня нет проблем с именами файлов и имен классов в случае верблюда, но в большинстве дистрибутивов Linux я сталкиваюсь с этими проблемами, поэтому мне легче просто назовите файлы и классы, как я упоминал ранее.
Зан Колев
Я почти уверен, что проблема в том, что Windows имеет слабую типизацию, то есть CheckUserName.php обрабатывается так же, как и Checkusername.php в Windows. Linux, однако, строго типизирован, что означает «CheckUserName.php» и «Checkusername.php» - это две совершенно разные вещи. Время от времени я сталкиваюсь с одними и теми же проблемами, потому что я занимаюсь разработкой для Windows и тестированием на CentOS.
Майк Леви
7

Из корневого каталога Magento выполните следующую команду:

php bin/magento setup:di:compile

Это снова скомпилирует Dependency Injection (DI), и ваша проблема исчезнет.

Nahid
источник
Я сказал, что я успешно выполнил эту команду, и она вывела всю корзину покупок как администратора, так и веб-интерфейс с ошибкой «не удалось открыть поток: отказано в разрешении в / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend -file / File.php. В админке и во
внешнем
Затем я снова выполнил команду, и обе части корзины вернулись к своему обычному поведению.
VectorVortec,
0

Ваш CheckUserName.phpфайл контроллера выглядит как ниже

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

}

очистить кеш.

после этого вы можете получить доступ к вашему контроллеру, используя ниже URL

http://192.168.0.52/m2ee/my_module/index/CheckUserName/ или http://192.168.0.52/m2ee/index.php/my_module/index/CheckUserName/

Примечание: my_module - это имя моего модуля, вы можете заменить его здесь.

см. ниже рис Моя сторона это работает

введите описание изображения здесь

дайте мне знать, если это не работает.

Bojjaiah
источник