Modo corretto per ottenere un oggetto sessione?


8

Sto scrivendo un modulo di pagamento per Magento 2 in questo momento e lo sto confrontando con il
CodeSniffer "Standard di codifica del programma di qualità di estensione Magento"
( https://github.com/magento/marketplace-eqp ).

Per ciascuna delle mie classi che utilizzano un oggetto sessione (di pagamento), CodeSniffer risponde con il seguente avviso:

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

Ricevo l'oggetto sessione nel modo seguente:

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

Esiste un modo corretto per ottenere l'oggetto sessione?
Non sono riuscito a trovare nulla nel codice core di Magento 2.
Ho trovato il codice solo dove è usato esattamente come lo uso io.


Ci sei mancato protected $checkoutSession;prima del Costruttore
Ankit Shah,

È lì, non l'ho mostrato in questo esempio di codice. L'ho aggiunto all'esempio per una migliore comprensibilità
Robert M.

stesso problema qui, condividilo se qualcuno ha una soluzione
Nikhil Vaghela,

Risposte:


4

Magento Docs sta dicendo

Se il costruttore di una classe è particolarmente dispendioso in termini di risorse, ciò può comportare un impatto sulle prestazioni non necessario quando un'altra classe dipende da essa, se l'oggetto costoso non risulta necessario durante una particolare richiesta.

Magento ha una soluzione per questa situazione: i proxy. I proxy estendono altre classi per trasformarli in versioni a caricamento lento. Ossia, un'istanza reale della classe estesa da un proxy viene creata solo dopo che uno dei metodi della classe viene effettivamente chiamato. Un proxy implementa la stessa interfaccia della classe originale e quindi può essere usato come dipendenza ovunque la classe originale possa. A differenza del suo genitore, un proxy ha una sola dipendenza: il gestore degli oggetti.

I proxy sono generati da codice e pertanto non devono essere scritti manualmente. (Vedere Generazione di codice per ulteriori informazioni.) È sufficiente fare riferimento a una classe nel formato \ Original \ Class \ Name \ Proxy e la classe viene generata se non esiste.

Proxy Magento 2

Quindi, nel tuo 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 \ Suffisso proxy per l'oggetto \ Magento \ Checkout \ Model \ Session



0

In base allo standard di codifica ECGM2 Magento 2, per prima cosa si utilizza la classe di sessione, quindi è possibile passarla al constuctor altrimenti verrà visualizzato questo errore

L'oggetto sessione NON DEVE essere richiesto nel costruttore. Può essere passato solo come argomento del metodo.

Esempio:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}

@Price Patel Ricevo ancora l'errore sopra riportato sull'uso di questo codice. Qualche soluzione? Questo è il mio codice: namespace ...; usa Magento \ Checkout \ Model \ Session come CheckoutSession; usa Magento \ Customer \ Model \ Session come CustomerSession; test di classe {private $ checkoutSession; $ customerSession privata; funzione pubblica __construct (CheckoutSession $ checkoutSession, CustomerSession $ customerSession) {$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.