Richtiger Weg, um ein Sitzungsobjekt zu erhalten?

8

Ich schreibe gerade ein Zahlungsmodul für Magento 2 und vergleiche es mit dem
CodeSniffer "Magento Extension Quality Program Coding Standard"
( https://github.com/magento/marketplace-eqp ).

Für jede meiner Klassen, die ein (Checkout-) Sitzungsobjekt verwenden, antwortet der CodeSniffer mit der folgenden Warnung:

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

Ich erhalte das Sitzungsobjekt folgendermaßen:

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

Gibt es einen korrekten Weg, um das Sitzungsobjekt zu erhalten?
Ich konnte im Magento 2-Kerncode nichts finden.
Ich konnte nur Code finden, bei dem er genauso verwendet wird wie ich.

Robert M.
quelle
Sie haben protected $checkoutSession;vor Constructor
Ankit Shah
Es ist da, ich habe es in diesem Beispielcode einfach nicht gezeigt. Ich habe es dem Beispiel zur besseren Verständlichkeit hinzugefügt
Robert M.
das gleiche Problem hier, teilen Sie es, wenn jemand eine Lösung hat
Nikhil Vaghela

Antworten:

4

Magento Docs sagen

Wenn der Konstruktor einer Klasse besonders ressourcenintensiv ist, kann dies zu unnötigen Leistungseinbußen führen, wenn eine andere Klasse davon abhängt, wenn das teure Objekt während einer bestimmten Anforderung nicht benötigt wird.

Magento hat eine Lösung für diese Situation: Proxies. Proxies erweitern andere Klassen, um faul geladene Versionen davon zu werden. Das heißt, eine reale Instanz der Klasse, die ein Proxy erweitert, wird erst erstellt, nachdem eine der Methoden der Klasse tatsächlich aufgerufen wurde. Ein Proxy implementiert dieselbe Schnittstelle wie die ursprüngliche Klasse und kann daher überall dort als Abhängigkeit verwendet werden, wo die ursprüngliche Klasse dies kann. Im Gegensatz zu seinem übergeordneten Proxy hat ein Proxy nur eine Abhängigkeit: den Objektmanager.

Proxies sind generierter Code und müssen daher nicht manuell geschrieben werden. (Weitere Informationen finden Sie unter Codegenerierung.) Verweisen Sie einfach auf eine Klasse in der Form \ Original \ Class \ Name \ Proxy. Die Klasse wird generiert, wenn sie nicht vorhanden ist.

Magento 2 Proxies

Also in deinem Fall

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

Hinweis \ Proxy- Suffix für das Objekt \ Magento \ Checkout \ Model \ Session

Adnan
quelle
0

Gemäß dem Magento 2 ECGM2-Codierungsstandard verwenden Sie zuerst die Sitzungsklasse, dann können Sie sie an den Konstruktor übergeben, andernfalls wird dieser Fehler angezeigt

Das Sitzungsobjekt darf im Konstruktor NICHT angefordert werden. Es kann nur als Methodenargument übergeben werden.

Beispiel:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

    public function __construct(
        ....
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_checkoutSession = $checkoutSession;
        ....
    }
}
Prinz Patel
quelle
@Price Patel Ich erhalte immer noch den obigen Fehler bei der Verwendung dieses Codes. Irgendeine Lösung? Dies ist mein Code: Namespace ...; Verwenden Sie Magento \ Checkout \ Model \ Session als CheckoutSession. Verwenden Sie Magento \ Customer \ Model \ Session als CustomerSession. class Test {private $ checkoutSession; private $ customerSession; öffentliche Funktion __construct (CheckoutSession $ checkoutSession, CustomerSession $ customerSession) {$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja