Magento2 - Custom Controller พ่นข้อผิดพลาด


12

ฉันสร้างโมดูลแสดงในนี้โพสต์ แต่ตัวควบคุมของฉันไม่ทำงาน ฉันได้รับข้อความแสดงข้อผิดพลาดนี้:

ข้อผิดพลาดที่สามารถกู้คืนได้: อาร์กิวเมนต์ 1 ผ่านไปยัง MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct () จะต้องเป็นอินสแตนซ์ของ Magento \ Framework \ App \ Action \ Context อินสแตนซ์ของ Magento \ Framework \ ObjectManager \ ObjectManager ที่กำหนดเรียกใน D : \ xampp \ htdocs \ magento2 \ seller \ magento \ framework \ ObjectManager \ Factory \ AbstractFactory.php บนบรรทัด 97 และกำหนดไว้ใน D: \ xampp \ htdocs \ magento2 \ app \ code \ mp \ MyModule \ Controller \ ดัชนี \ 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 แสดงความคิดเห็นฟังก์ชั่น __ สร้างแล้วตรวจสอบอีกครั้ง และลบโฟลเดอร์สร้างออกจาก magento var dir ของคุณด้วย
Shaheer Ali

สวัสดี Shaheer โชคไม่ดีที่แก้ปัญหาไม่ได้
ClassMP

คุณลบโฟลเดอร์สร้างหรือไม่?
Shaheer Ali

ไม่คุณหมายถึงโฟลเดอร์ / var / generation หรือไม่ เนื้อหาในโฟลเดอร์การสร้างจะถูกสร้างขึ้นได้อย่างไร? ฉันจำเป็นต้องคอมไพล์ใหม่ด้วย "magento setup: di: compile" หรือไม่?
ClassMP

ใช่ฉันหมายความว่า M2 ก่อนสร้างไฟล์จากโรงงานในเวลาทำงาน ไม่คุณไม่จำเป็นต้องคอมไพล์
ซ้ำ

คำตอบ:


18

หลังจากการปรับใช้โมดูลบนสภาพแวดล้อม CentOS dev ใหม่ให้ลบโฟลเดอร์ var / di และ var / generation และคอมไพล์ใหม่อีกครั้งซึ่งจะทำงาน ก่อนหน้านั้นฉันใช้สภาพแวดล้อม Win Xampp นั่นทำให้เกิดปัญหามากมาย ...


2
สามารถยืนยันผลงานนี้ได้เป็นความเจ็บปวดที่คุณต้องทำเมื่อใดก็ตามที่เพิ่มเส้นทางใหม่
Alex

1
นี่เป็นปัญหาเฉพาะ CentOS หรือไม่
เมียร์

2
@Mir นี่ไม่ใช่ปัญหาของระบบปฏิบัติการ @Alex ทุกครั้งที่คุณทำการเปลี่ยนแปลงบางอย่างเกี่ยวกับการฉีดการพึ่งพาคุณเพียงแค่เรียกใช้php bin/magento setup:di:compileคำสั่งนี้จะทำทุกอย่าง
Nahid

7

ฉันพบปัญหาเดียวกัน หลังจากไม่กี่ชั่วโมงจากการดีบั๊กแบบไม่มีจุดหมายและกระแทกหัวของฉันจากกำแพงฉันมาด้วยวิธีแก้ปัญหาที่ทำงานได้ดีสำหรับฉัน

ในที่สุดฉันเปลี่ยนชื่อชื่อไฟล์การกระทำทั้งหมดและชื่อคลาสจากอูฐกรณีเช่น

จาก:

D: \ XAMPP \ htdocs \ magento2 \ แอป \ รหัส \ MP \ MyModule \ ควบคุม \ ดัชนี \ CheckUserName.php

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

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

ถึง:

D: \ XAMPP \ htdocs \ magento2 \ แอป \ รหัส \ MP \ MyModule \ ควบคุม \ ดัชนี \ Checkusername.php

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

มีบางสิ่งที่เกี่ยวข้องกับ Magento2 รุ่นล่าสุดหรือไม่ ฉันมีมันทำงานในสภาพแวดล้อมท้องถิ่นของฉันไม่มีปัญหา แต่เมื่อฉันรันเดคอมไพเลอร์คือเมื่อมันมาถึงปัญหานั้น
awavi

มีบางสิ่งที่เกี่ยวข้องกับสภาพแวดล้อมเซิร์ฟเวอร์ จากประสบการณ์ของฉันเมื่อฉันพัฒนาโมดูลบน Windows (หรือ Mac เมื่อเร็ว ๆ นี้) ฉันไม่ได้มีปัญหากับชื่อไฟล์และชื่อคลาสอูฐ แต่ใน Linux ส่วนใหญ่ distros ฉันพบปัญหาเหล่านี้ดังนั้นฉันจึงพบว่า เพียงตั้งชื่อไฟล์และคลาสตามที่ฉันพูดถึงก่อนหน้านี้
Zan Kolev

ฉันค่อนข้างแน่ใจว่าปัญหาคือ Windows พิมพ์อย่างอ่อนความหมาย 'CheckUserName.php' จะได้รับการปฏิบัติเช่นเดียวกับ 'Checkusername.php' ใน Windows อย่างไรก็ตาม Linux มีการพิมพ์อย่างมากหมายถึง 'CheckUserName.php' และ 'Checkusername.php' เป็นสองสิ่งที่แตกต่างกันอย่างสิ้นเชิง ฉันพบปัญหาเดียวกันเป็นครั้งคราวเพราะฉันพัฒนาบน Windows และทดสอบกับ CentOS
Mike Levy

7

จากไดเรกทอรีรากของ Magento ให้เรียกใช้คำสั่งต่อไปนี้:

php bin/magento setup:di:compile

วิธีนี้จะรวบรวมการพึ่งพาการฉีด (DI) อีกครั้งและปัญหาของคุณจะหายไป


ฉันรันคำสั่งนั้นสำเร็จแล้วกล่าวและเอาตะกร้าสินค้าทั้งหมดทั้ง admin และส่วนหน้ามีข้อผิดพลาด "ไม่สามารถเปิดสตรีม: การอนุญาตถูกปฏิเสธใน / var / www / html / mangento2 / ผู้ขาย / colinmollenhour / cache-backend -file / File.php มีข้อผิดพลาดเดียวกันในผู้ดูแลระบบและส่วนหน้า
VectorVortec

จากนั้นฉันก็รันคำสั่งอีกครั้งและทั้งสองส่วนของตะกร้าสินค้ากลับสู่การทำงานตามปกติ
VectorVortec

0

CheckUserName.phpไฟล์คอนโทรลเลอร์ของคุณมีลักษณะดังนี้

MP / MyModule / ควบคุม / ดัชนี / 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 ด้านของฉันมันทำงาน

ป้อนคำอธิบายรูปภาพที่นี่

แจ้งให้เราทราบหากมันไม่ทำงาน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.