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}

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. Это вызывает много проблем ...


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), и ваша проблема исчезнет.


Я сказал, что я успешно выполнил эту команду, и она вывела всю корзину покупок как администратора, так и веб-интерфейс с ошибкой «не удалось открыть поток: отказано в разрешении в / 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 - это имя моего модуля, вы можете заменить его здесь.

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.