Правильный способ получения объекта сеанса?

8

Я пишу модуль оплаты для Magento 2 прямо сейчас и проверяю его на соответствие
CodeSniffer «Стандарт кодирования программы расширения качества Magento»
( https://github.com/magento/marketplace-eqp ).

Для каждого из моих классов, которые используют объект сеанса (извлечение), CodeSniffer отвечает следующим предупреждением:

Session object MUST NOT be requested in constructor. It can only be passed as a method argument.

Я получаю объект сеанса следующим образом:

/**
 * Checkout session object
 *
 * @var \Magento\Checkout\Model\Session
 */
protected $checkoutSession;

/**
 * Constructor
 *
 * @param  \Magento\Checkout\Model\Session $checkoutSession
 * @return void
 */
public function __construct(\Magento\Checkout\Model\Session $checkoutSession)
{
    $this->checkoutSession = $checkoutSession;
}

Есть ли правильный способ получить объект сеанса?
Я не смог найти ничего в коде ядра Magento 2.
Я мог только найти код, где он используется точно так же, как я его использую.

Роберт М.
источник
U пропустили protected $checkoutSession;раньше конструктора
Анкит Шах
Это там, я просто не показал это в этом примере кода. Я добавил это к примеру для большей понятности
Роберт М.
тот же вопрос здесь, поделитесь им, если у кого-то есть решение
Нихил Вагела

Ответы:

4

Magento Docs говорят

Если конструктор класса особенно ресурсоемкий, это может привести к ненужному снижению производительности, когда от него зависит другой класс, если дорогой объект не понадобится во время определенного запроса.

У Magento есть решение для этой ситуации: прокси. Прокси расширяют другие классы и становятся их загруженными лентами. То есть реальный экземпляр класса, который расширяет прокси, создается только после того, как один из методов класса фактически вызван. Прокси-сервер реализует тот же интерфейс, что и исходный класс, и поэтому может использоваться как зависимость везде, где может исходный класс. В отличие от своего родителя, прокси имеет только один раз зависимость: менеджер объектов.

Прокси являются сгенерированным кодом и, следовательно, не должны быть написаны вручную. (См. Генерация кода для получения дополнительной информации.) Просто обратитесь к классу в форме \ Original \ Class \ Name \ Proxy, и класс генерируется, если он не существует.

Magento 2 Прокси

Итак, в вашем случае

/**
 * Checkout session object
 *
 * @var \Magento\Checkout\Model\Session\Proxy
 */
protected $checkoutSession;

/**
 * Constructor
 *
 * @param  \Magento\Checkout\Model\Session\Proxy $checkoutSession
 * @return void
 */
public function __construct(\Magento\Checkout\Model\Session\Proxy $checkoutSession)
{
    $this->checkoutSession = $checkoutSession;
}

Примечание \ Прокси- суффикс для объекта \ Magento \ Checkout \ Model \ Session

Аднан
источник
0

В соответствии со стандартом кодирования Magento 2 ECGM2 вы сначала используете класс сеанса, а затем можете передать его в конструктор, в противном случае будет показана эта ошибка.

Объект сеанса НЕ ДОЛЖЕН запрашиваться в конструкторе. Он может быть передан только в качестве аргумента метода.

Пример:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}
Принц Патель
источник
@ Цена Патель Я все еще получаю вышеупомянутую ошибку при использовании этого кода. Любое решение? Это мой код: пространство имен ...; используйте Magento \ Checkout \ Model \ Session в качестве CheckoutSession; используйте Magento \ Customer \ Model \ Session в качестве CustomerSession; класс Test {private $ checkoutSession; private $ customerSession; открытая функция __construct (CheckoutSession $ checkoutSession, CustomerSession $ customerSession) {$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja