Comment obtenir un objet de session correctement?

8

J'écris un module de paiement pour Magento 2 en ce moment et je le
compare au CodeSniffer "Magento Extension Quality Program Coding Standard"
( https://github.com/magento/marketplace-eqp ).

Pour chacune de mes classes qui utilisent un objet de session (d'extraction), le CodeSniffer répond avec l'avertissement suivant:

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

J'obtiens l'objet session de la manière suivante:

/**
 * 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-t-il un moyen correct d'obtenir l'objet de session?
Je n'ai rien trouvé dans le code de base de Magento 2.
Je n'ai pu trouver du code que là où il est utilisé exactement de la même manière que je l'utilise.

Robert M.
la source
Vous avez manqué protected $checkoutSession;avant Constructor
Ankit Shah
Il est là, je ne l'ai simplement pas montré dans cet exemple de code. Je l'ai ajouté à l'exemple pour une meilleure compréhension
Robert M.
même problème ici, partagez-le si quelqu'un a une solution
Nikhil Vaghela

Réponses:

4

Magento Docs dit

Si le constructeur d'une classe est particulièrement gourmand en ressources, cela peut entraîner un impact inutile sur les performances lorsqu'une autre classe en dépend, si l'objet coûteux ne finit pas par être nécessaire lors d'une requête particulière.

Magento a une solution à cette situation: les procurations. Les proxys étendent d'autres classes pour en devenir des versions paresseuses. Autrement dit, une instance réelle de la classe qu'un proxy étend n'est créée qu'après l'appel d'une des méthodes de la classe. Un proxy implémente la même interface que la classe d'origine et peut donc être utilisé comme dépendance partout où la classe d'origine le peut. Contrairement à son parent, un proxy n'a qu'une seule dépendance: le gestionnaire d'objets.

Les proxys sont du code généré et n'ont donc pas besoin d'être écrits manuellement. (Voir Génération de code pour plus d'informations.) Faites simplement référence à une classe sous la forme \ Original \ Class \ Name \ Proxy, et la classe est générée si elle n'existe pas.

Proxy Magento 2

Donc, dans ton cas

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

Remarque \ Suffixe proxy pour l'objet \ Magento \ Checkout \ Model \ Session

Adnan
la source
0

Selon la norme de codage Magento 2 ECGM2, vous utilisez d'abord la classe de session, puis vous pouvez la passer dans le constructeur sinon cette erreur sera affichée

L'objet de session NE DOIT PAS être demandé dans le constructeur. Il ne peut être transmis que comme argument de méthode.

Exemple:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}
Prince Patel
la source
@Price Patel J'ai toujours l'erreur ci-dessus sur l'utilisation de ce code. Toute solution? Voici mon code: namespace ...; utiliser Magento \ Checkout \ Model \ Session comme CheckoutSession; utiliser Magento \ Customer \ Model \ Session comme CustomerSession; classe Test {private $ checkoutSession; privé $ customerSession; fonction publique __construct (CheckoutSession $ checkoutSession, CustomerSession $ customerSession) {$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja