【问题标题】:Magento 2: Argument 1 passed to Controller::__construct() must be an instance of ..\..\..\Action\Context, instance of ..\..\..\ObjectManager givenMagento 2:传递给 Controller::__construct() 的参数 1 必须是 ..\..\..\Action\Context 的实例,给定 ..\..\..\ObjectManager 的实例
【发布时间】:2017-04-06 18:06:45
【问题描述】:

当我尝试运行 Magento 2 模块时出现以下错误:

致命错误:未捕获的类型错误:参数 1 传递给 MyModule\Service\Controller\Module\Version::__construct() 必须是 Magento\Framework\App\Action\Context 的实例, Magento\Framework\ObjectManager\ObjectManager 给定,调用 /srv/www/vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php 在第 93 行并定义在 /srv/www/app/code/MyModule/Service/Controller/Module/version.php:16

这发生在我编译运行此命令后:

magento setup:di:compile

我阅读了很多建议清除 /var/di 和 /var/generation 文件夹的帖子,虽然这可以修复错误,但仅适用于开发环境。我无法在生产环境中清除这些文件夹,因为它会导致其他扩展中断。

这是我的控制器:

namespace MyModule\Service\Controller\Module;

class Version extends \MyModule\Service\Controller\Module {

    protected $resultJsonFactory;
    protected $objectManager;
    protected $helper = null;
    protected $config = null;

    /**
     * @param \Magento\Framework\App\Action\Context $context
     * @param \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory
     * @param \MyModule\Service\Helper\Data $helper
     */
    public function __construct(
        \Magento\Framework\App\Action\Context $context,
        \Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
        \MyModule\Service\Helper\Data $helper
    ) {

        $this->resultJsonFactory = $resultJsonFactory;
        $this->helper = $helper;
        $this->objectManager = $context->getObjectManager();
        parent::__construct($context);
        parent::initParams();

    }

    /**
     * @return \Magento\Framework\Controller\Result\Json
     */
    public function execute()
    {
        $result = $this->resultJsonFactory->create();
        $data = new \stdClass();
        $data->magentoVersion = (string) $this->objectManager->get('\Magento\Framework\App\ProductMetadata')->getVersion();
        $data->phpVersion = (string) phpversion();
        $data->moduleEnabled = $this->helper->getConfig()['enabled'];
        $data->apiVersion = "2.0";
        return $result->setData($data);
    }
}

这就是我的 MyModule\Service\Controller

namespace MyModule\Service\Controller;

abstract class Module extends \Magento\Framework\App\Action\Action {

    protected $pageSize = null;
    protected $pageNum = 0;
    protected $startDate = null;
    protected $endDate = null;
    protected $sortDir = 'asc';
    protected $filterField = 'created_at';
    protected $id = null;
    protected $helper;

    protected function initParams() {
        if ((bool) $pageSize = $this->getRequest()->getParam('page_size')) {
            $this->pageSize = $pageSize;
        }
        if ((bool) $pageNum = $this->getRequest()->getParam('page_num')) {
            $this->pageNum = $pageNum;
        }
        if ((bool) $startDate = $this->getRequest()->getParam('start_date')) {
            $this->startDate = $startDate;
            if ((bool) $endDate = $this->getRequest()->getParam('end_date')) {
                $this->endDate = $endDate;
            } else {
                $this->endDate = date('Y-m-d');
            }
        } elseif ((bool) $updatedStartDate = $this->getRequest()->getParam('updated_start_date')) {
            $this->filterField = 'updated_at';
            $this->startDate = $updatedStartDate;
            if ((bool) $updatedEndDate = $this->getRequest()->getParam('updated_end_date')) {
                $this->endDate = $updatedEndDate;
            } else {
                $this->endDate = date('Y-m-d');
            }
        }
        if ((bool) $sortDir = $this->getRequest()->getParam('sort_dir')) {
            $this->sortDir = $sortDir;
        }
        if ((bool) $id = $this->getRequest()->getParam('id')) {
            $this->id = $id;
        }
    }

    protected function isEnabled() {
        return $this->helper->getConfig()['enabled'];
    }

    protected function isAuthorized() {

        $token = $this->helper->getConfig()['security_token'];
        $authToken = (isset($_SERVER['HTTP_X_TOKEN']) ? $_SERVER['HTTP_X_TOKEN'] : $_SERVER['X_TOKEN']);

        if (empty($authToken)) {
            return false;
        }

        if (trim($token) != trim($authToken)) {
            $this->helper->log('feed request with invalid security token');
            return false;
        }

        return true;
    }
}

【问题讨论】:

标签: php dependency-injection magento2


【解决方案1】:

如果您处于生产模式,请切换到维护模式,清除 var/cache、var/generation 并重新运行编译。 并且不要忘记禁用维护模式

【讨论】:

    【解决方案2】:

    尝试使用 rm -rf var/generation/* 命令从 magento 根目录中删除旧生成的文件,因为 magento 会使用其构造函数预先生成所有类文件。生成的类扩展了原始类并被 magento 用来调用插件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-15
      • 2018-08-14
      • 2015-05-11
      • 2017-06-12
      • 1970-01-01
      • 2019-08-12
      • 2018-08-30
      • 2020-06-15
      相关资源
      最近更新 更多