¿Forma correcta de obtener un objeto de sesión?

8

Estoy escribiendo un módulo de pago para Magento 2 en este momento y lo estoy
comparando con el "Estándar de Codificación del Programa de Calidad de Extensión de Magento" CodeSniffer
( https://github.com/magento/marketplace-eqp ).

Para cada una de mis clases que utilizan un objeto de sesión (pago), CodeSniffer responde con la siguiente advertencia:

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

Estoy obteniendo el objeto de sesión de la siguiente manera:

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

¿Hay una forma correcta de obtener el objeto de sesión?
No pude encontrar nada en el código central de Magento 2.
Solo pude encontrar el código donde se usa exactamente de la misma manera que lo uso.

Robert M.
fuente
Te has perdido protected $checkoutSession;antes de Constructor
Ankit Shah
Está allí, simplemente no lo mostré en este código de ejemplo. Lo agregué al ejemplo para una mejor comprensión
Robert M.
mismo problema aquí, compártelo si alguien tiene solución
Nikhil Vaghela

Respuestas:

4

Los documentos de Magento dicen

Si el constructor de una clase es particularmente intensivo en recursos, esto puede conducir a un impacto innecesario en el rendimiento cuando otra clase depende de él, si el objeto costoso no termina siendo necesario durante una solicitud en particular.

Magento tiene una solución para esta situación: proxies. Los servidores proxy amplían otras clases para convertirse en versiones perezosas de ellos. Es decir, una instancia real de la clase que un proxy extiende se crea solo después de que se llame a uno de los métodos de la clase. Un proxy implementa la misma interfaz que la clase original y, por lo tanto, se puede usar como una dependencia en cualquier lugar que la clase original pueda. A diferencia de su padre, un proxy tiene una sola dependencia: el administrador de objetos.

Los proxies son código generado y, por lo tanto, no necesitan escribirse manualmente. (Consulte Generación de código para obtener más información). Simplemente haga referencia a una clase en el formulario \ Original \ Class \ Name \ Proxy, y la clase se genera si no existe.

Proxies de Magento 2

Entonces, en tu 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 \ Sufijo de proxy para el objeto \ Magento \ Checkout \ Model \ Session

Adnan
fuente
0

Según el estándar de codificación Magento 2 ECGM2, primero usa la clase de sesión y luego puede pasarlo al constructor; de lo contrario, se mostrará este error

El objeto de sesión NO DEBE solicitarse en el constructor. Solo se puede pasar como argumento de método.

Ejemplo:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}
Príncipe Patel
fuente
@Precio Patel Todavía recibo el error anterior al usar este código. ¿Alguna solución? Este es mi código: espacio de nombres ...; use Magento \ Checkout \ Model \ Session como CheckoutSession; use Magento \ Customer \ Model \ Session como CustomerSession; Prueba de clase {private $ checkoutSession; privado $ customerSession; función pública __construct (CheckoutSession $ checkoutSession, CustomerSession $ customerSession) {$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja