Magento2: Аргумент 1 [...] должен быть экземпляром Magento\Framework\App\Helper\Context.Php

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Magento2: Аргумент 1 [...] должен быть экземпляром Magento\Framework\App\Helper\Context.

Сообщение Anonymous »

Во-первых, я новичок в Magento 2, но уже некоторое время использую Magento 1.x.

Я много читал о том, как решать проблемы, связанные с внедрением зависимостей, но застрял на этом:


Исключение № 0 (Исключение): Устранимая ошибка: аргумент 1, переданный в Cefar\AO\Helper\Ao::__construct(), должен быть экземпляром Magento\Framework\App\Helper\ Контекст, задан экземпляр Magento\Framework\ObjectManager\ObjectManager, вызываемый в .../vendor/magento/framework/ObjectManager/Factory/AbstractFactory.php в строке 93 и определенный в .../Cefar/AO/Helper/Ao. php в строке 11


Во многих других ответах предлагалось удалить папки 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 уже работает.

Подробнее здесь: https://stackoverflow.com/questions/408 ... p-helper-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»