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: di: compile"?
ClassMP

так, я маю на увазі це. M2 попередньо генерує заводські файли під час виконання. Ні, вам не потрібно перекомпілювати
Шахер Алі

Відповіді:


18

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


2
Можна підтвердити, що це працює, болісно, ​​що вам доводиться це робити щоразу, коли додаєте новий маршрут
Алекс,

1
Це насправді єдине питання CentOS?
Мир

2
@Mir це не проблема ОС. @Alex щоразу, коли ви вносите якісь зміни щодо введення залежності, вам просто потрібно виконати php bin/magento setup:di:compileцю команду.
Nahid

7

Я зіткнувся з тим же питанням. Після кількох годин безглуздої налагодження та удару головою об стіну я придумав рішення, яке добре працювало для мене.

Врешті-решт, я перейменував усі назви файлів дій та назви класів з верблюда, тобто

Від:

D: \ xampp \ htdocs \ magento2 \ app \ код \ 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 {
...
}

Чи має щось спільне з останньою версією Magento2? У мене він працює в моєму локальному середовищі без проблем, проте коли я запускаю де компілятор, це стосується цієї проблеми.
awavi

Це має відношення до серверного середовища. З мого досвіду, коли я розробляю модуль для Windows (або Mac останнім часом), у мене не виникає проблем з іменами файлів корпусу верблюда та іменами класів, але в більшості дистрибутивів Linux я стикаюся з цими проблемами, тому мені легше просто назвіть файли та класи, як я вже згадував раніше.
Зан Колев

Я впевнений, що проблема в Windows недостатньо набрана, тобто "CheckUserName.php" трактується так само, як "Checkusername.php" у Windows. Однак у Linux сильно набрано, що означає "CheckUserName.php" та "Checkusername.php" - дві абсолютно різні речі. Час від часу я стикаюся з одними і тими ж проблемами, тому що займаюся розробкою в Windows і тестуванням на CentOS.
Майк Леві

7

З кореневого каталогу Magento запустіть наступну команду:

php bin/magento setup:di:compile

Це знову складе ін'єкційне введення залежності (DI), і ваше питання піде назовні.


Я запустив цю команду успішно, вона сказала, і вона зняла всю кошик для покупок і адміністратора, і фронтенда з помилкою, "не вдалося відкрити потік: у дозволі відмовлено в / var / www / html / mangento2 / vendor / colinmollenhour / cache-backend -file / File.php. Вона мала однакову помилку в адміністраторі та інтерфейсі
VectorVortec

Потім я знову запустив команду, і обидві частини кошика повернулися до своєї нормальної поведінки.
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 - це фронтальна назва мого модуля, тут ви можете замінити своє переднє ім’я.

дивіться нижче pic Моя сторона працює

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

дайте мені знати, якщо це не працює.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.