セッションオブジェクトを取得する正しい方法は?


8

私は現在Magento 2の支払いモジュールを書いており、
「Magento Extension Quality Program Coding Standard」CodeSniffer
https://github.com/magento/marketplace-eqp)と照合しています

(チェックアウト)セッションオブジェクトを使用しているすべてのクラスに対して、CodeSnifferは次の警告で応答します。

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

次の方法でセッションオブジェクトを取得しています。

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

セッションオブジェクトを取得する正しい方法はありますか?
Magento 2のコアコードには何も見つかりませんでした。
私はそれを使用するのとまったく同じ方法で使用されているコードを見つけることができました。


Uがprotected $checkoutSession;コンストラクタの前に逃した
Ankit Shah 2016

それはそこにあります、私はこのサンプルコードでそれを表示しませんでした。わかりやすくするために例に追加しました
Robert M.

ここで同じ問題、
誰か

回答:


4

Magentoドキュメントは言っています

クラスのコンストラクターが特にリソースを大量に消費する場合、高価なオブジェクトが特定のリクエスト中に必要とされない場合、別のクラスがそれに依存していると、パフォーマンスに不要な影響が生じる可能性があります。

Magentoには、この状況に対する解決策があります。プロキシです。プロキシは他のクラスを拡張して、それらの遅延ロードバージョンになります。つまり、プロキシが拡張するクラスの実際のインスタンスは、クラスのメソッドの1つが実際に呼び出された後にのみ作成されます。プロキシは、元のクラスと同じインターフェイスを実装するため、元のクラスができるところならどこでも依存関係として使用できます。親とは異なり、プロキシには、オブジェクトマネージャーという依存関係が1回だけあります。

プロキシは生成されたコードであるため、手動で作成する必要はありません。(詳細については、コード生成を参照してください。)\ Original \ Class \ Name \ Proxyの形式でクラスを参照するだけで、クラスが存在しない場合は生成されます。

Magento 2プロキシ

だから、あなたの場合

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

\ Magento \ Checkout \ Model \ Sessionオブジェクトの\ Proxyサフィックス



0

Magento 2 ECGM2コーディング標準に従って、最初にセッションクラスを使用し、それをコンストラクターに渡すことができます。そうでない場合、このエラーが表示されます

コンストラクターでセッションオブジェクトを要求してはなりません。メソッドの引数としてのみ渡すことができます。

例:

namespace vendor\module\..;

use Magento\Checkout\Model\Session as CheckoutSession;

class ClassName {
    ...

    protected $_checkoutSession;

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

@Price Patel私はまだこのコードを使用すると上記のエラーが発生します。これは私のコードです:名前空間...; Magento \ Checkout \ Model \ SessionをCheckoutSessionとして使用します。Magento \ Customer \ Model \ SessionをCustomerSessionとして使用します。class Test {private $ checkoutSession; プライベート$ customerSession; public function __construct(CheckoutSession $ checkoutSession、CustomerSession $ customerSession){$ this-> checkoutSession = $ checkoutSession; $ this-> customerSession = $ customerSession; }
Vindhuja 2018
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.