Magento2-自定义控制器引发错误


12

我创建所示的模块这个职位。但是我自己的控制器不起作用。我收到此错误消息:

可恢复的错误:传递给MP \ MyModule \ Controller \ Index \ CheckUserName :: __ construct()的参数1必须是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中定义。第35行的php

这是我的控制器代码:

<?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目录中删除了generation文件夹
Shaheer Ali

嗨,Shaheer,您好,这不能解决问题。
ClassMP

您是否删除了生成文件夹?
Shaheer Ali

否。您是指/ var / generation文件夹吗?如何生成文件夹中的内容?我是否需要使用“ magento setup:di:compile”重新编译?
ClassMP

是的,我的意思是。M2在运行时预生成工厂文件。不,您不需要重新编译
Shaheer Ali

Answers:


18

在新的CentOS开发环境上部署模块后,删除var / di和var / generation文件夹并重新编译di即可。在此之前,我使用Win Xampp环境。那会带来很多麻烦...


2
可以证实这一点的作品,这是一个痛苦的是你必须做的,只要增加一个新的途径
亚历克斯

1
这真的是CentOS唯一的问题吗?
Mir

2
@Mir这不是操作系统问题。@Alex每当您对依赖注入进行一些更改时,只需运行php bin/magento setup:di:compile此命令即可完成所有操作。
Nahid

7

我遇到了同样的问题。经过数小时的毫无意义的调试并从墙上砸了个头,我想出了一个对我来说很好的解决方案。

最后,我将所有动作文件名和类名都重命名为驼峰式,即

从:

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

至:

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

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

它与Magento2的最新版本有关吗?我可以在我的本地环境上运行它,没有任何问题,但是当我运行de编译器时就是要解决该问题。
awavi

它与服务器环境有关。根据我的经验,当我在Windows(或Mac)上开发模块时,我没有驼峰式文件名和类名的问题,但是在大多数Linux发行版中,我遇到了这些问题,因此我发现更容易就像我前面提到的那样命名文件和类。
Zan Kolev

我很确定问题是Windows的类型很弱,这意味着在Windows中将'CheckUserName.php'与'Checkusername.php'相同。但是,Linux是强类型的,意味着“ CheckUserName.php”和“ Checkusername.php”是两个完全不同的东西。我不时遇到相同的问题,因为我在Windows上进行开发并在CentOS上进行测试。
Mike Levy

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

}

清除缓存。

之后,您可以使用以下网址访问您的控制器

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我这边正在工作

在此处输入图片说明

让我知道它是否不起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.