Maneira correta de obter um objeto de sessão?

8

Estou escrevendo um módulo de pagamento para o Magento 2 agora e comparando-o com o
CodeSniffer "Padrão de codificação do programa de qualidade de extensão Magento"
( https://github.com/magento/marketplace-eqp ).

Para todas as minhas classes que estão usando um objeto de sessão (checkout), o CodeSniffer responde com o seguinte aviso:

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

Estou recebendo o objeto de sessão da seguinte maneira:

/**
 * 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;
}

Existe uma maneira correta de obter o objeto de sessão?
Não encontrei nada no código principal do Magento 2.
Só consegui encontrar o código onde é usado exatamente da mesma maneira que o uso.

Robert M.
fonte
Você perdeu protected $checkoutSession;antes do Construtor
Ankit Shah
Está lá, apenas não o mostrei neste exemplo de código. Eu adicionei-lo para o exemplo para uma melhor compreensibilidade
Robert M.
mesmo problema aqui, compartilhe-o se alguém tiver uma solução #
Nikhil Vaghela 26/07/17

Respostas:

4

Os documentos do Magento estão dizendo

Se o construtor de uma classe é particularmente intensivo em recursos, isso pode levar a um impacto desnecessário no desempenho quando outra classe depende dela, se o objeto caro não acabar sendo necessário durante uma solicitação específica.

Magento tem uma solução para esta situação: proxies. Os proxies estendem outras classes para se tornarem versões preguiçosas deles. Ou seja, uma instância real da classe que um proxy estende é criada somente depois que um dos métodos da classe é realmente chamado. Um proxy implementa a mesma interface que a classe original e, portanto, pode ser usado como uma dependência em qualquer lugar da classe original. Ao contrário do pai, um proxy tem apenas uma dependência: o gerenciador de objetos.

Os proxies são código gerado e, portanto, não precisam ser escritos manualmente. (Consulte Geração de código para obter mais informações.) Simplesmente faça referência a uma classe no formato \ Original \ Class \ Name \ Proxy, e a classe será gerada se ela não existir.

Magento 2 Proxies

Então, no seu caso

/**
 * 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;
}

Nota \ Sufixo proxy para o objeto \ Magento \ Checkout \ Model \ Session

Adnan
fonte
0

De acordo com o padrão de codificação Magento 2 ECGM2, você primeiro usa a classe session e pode passá-la ao constuctor, caso contrário, esse erro será mostrado

Objeto de sessão não deve ser solicitado no construtor. Só pode ser passado como um argumento de método.

Exemplo:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}
Prince Patel
fonte
@ Preço Patel Ainda recebo o erro acima ao usar este código. Alguma solução? Este é o meu código: namespace ...; use Magento \ Checkout \ Model \ Session como CheckoutSession; use Magento \ Customer \ Model \ Session como CustomerSession; teste da classe {private $ checkoutSession; private $ customerSession; função pública __construct (CheckoutSession $ checkoutSession, CustomerSession $ customerSession) {$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja