Magento2:参数 1 [...] 必须是 Magento\Framework\App\Helper\Context

问题描述 投票:0回答:1

首先,我对 Magento 2 还很陌生,但我已经使用 Magento 1.x 一段时间了。

我读了很多关于如何解决 DI 相关问题的文章,但我一直停留在这个问题上:

Exception #0(异常):可恢复错误:传递给 Cefar\AO\Helper\Ao::__construct() 的参数 1 必须是 Magento\Framework\App\Helper\Context 的实例,Magento\Framework\ObjectManager\ 的实例给定的 ObjectManager,在第 93 行的 .../vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php 中调用,并在第 11 行的 .../Cefar/AO/Helper/Ao.php 中定义

许多其他答案建议删除 var/di 和 var/ Generation 文件夹,有时也删除 var/cache 。虽然这解决了问题,但是一旦运行

bin/magento setup:di:compile
就会再次出现,这意味着代码无法在生产环境中使用。

我已经检查过 Ao 类没有实例化任何对象。它也不会尝试重新创建给定上下文可以提供的任何对象。这是代码:

namespace Cefar\AO\Helper;

class Ao extends \Magento\Framework\App\Helper\AbstractHelper
{
    const DEFAULT_GRID_COLS = 4;

    protected $_session;

    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Customer\Model\Session $session
    )
    {
        parent::__construct($context);
        $this->_session = $session;
    }

    public function getConfig($path)
    {
        return $this->scopeConfig->getValue($path);
    }

    public function isActive($url = null, $print = true) {
        $active = ($url && strstr($_SERVER['REQUEST_URI'], $url) !== false);

        if ($active && $print) {
            echo "active";
        } else {
            return $active;
        }
    }

    public function isLoggedIn()
    {
        return $this->_session->isLoggedIn();
    }

    public function limitWords($text = '', $limit = 10, $showDots = true)
    {
        $words = explode(' ', $text);
        $limited = array_slice($words, 0, $limit);
        $newText = implode(' ', $limited);

        if (count($words) > $limit && $showDots) {
            $newText .= '...';
        }

        return $newText;
    }

    public function getCurrentGrid()
    {
        return ($this->_getRequest()->getParam('grid'))
            ? $this->_getRequest()->getParam('grid')
            : self::DEFAULT_GRID_COLS;
    }
}

这里没有什么特别的。我很困惑这是怎么发生的;扩展中每个其他定义的类都可以正确获取其 DI 参数。为什么 ObjectManager 装置提供不需要的参数?错误报告中给出的相关调用为:

.../vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php(93): Cefar\AO\Helper\Ao->__construct(Object(Magento\Framework\ObjectManager\ObjectManager))

所以它甚至没有提供两个参数!

我还读过有关在

di.xml
中提供类型提示的内容,但它似乎与这里无关,因为这两种类型都是 Magento 库的一部分?我注意到有一个
Magento\Framework\App\Helper\Context
的条目,但没有
Magento\Customer\Model\Session
的条目...但是有一些框架类使用 ID 来导入
Magento\Customer\Model\Session
已经可以工作了。

php magento magento2
1个回答
0
投票

长话短说,这是因为拼写错误。

有时,当帮助者被包括在内时,它被称为

Cefar\AO\Helper\Ao
,而其他时候,则被称为
Cefar\AO\Helper\AO
。本质上,ObjectManager 正在解析对同一个类的这两个引用,但它只有其中一个名称的类型提示,因此它不知道向错误的名称提供什么。

Magento 如果能有一点帮助就好了!也许会出现错误报告,表明未找到所请求的类?不过,至少这件事终于结束了。

© www.soinside.com 2019 - 2024. All rights reserved.