Magento 2:ObjectManagerとプロキシクラス

Magento 2でオブジェクト作成するプロセスには、Magento 2に固有の機能と、特定の条件下( プロキシファクトリーインターセプター )でのコードの自動生成に関連する機能が含まれます。 インターセプターの場合、それは多かれ少なかれ明らかでしたが、生成された他の2つのタイプのクラスの目的は誤解の霧に隠されていました。 そして、もし私がまだファクトリーに関して、そしてプロキシークラスに関して霧を持っているなら-霧は消えました。







CLIモードで何らかのアクションを実行するコマンドを作成するとします。 このコマンドで\Magento\Quote\Api\CartManagementInterface



インターフェースの実装を使用すると仮定します。これはObjectManagerコンストラクターで渡されます。







 public function __construct(\Magento\Quote\Api\CartManagementInterface $cartManagement) {}
      
      





\Magento\Quote\Api\CartManagementInterface



をチームで直接使用することはできません。この実装は間接的にプルすることができます。 \Magento\Quote\Api\CartManagementInterface



ます。







それでも、チームが\Magento\Quote\Api\CartManagementInterface



のデフォルト実装に直接または間接的に依存している場合、コマンドを実行しようとすると、たとえば:







 $ ./bin/magento list
      
      





私たちは間違って脱落します







 [Magento\Framework\Exception\SessionException] Area code not set: Area code must be set before starting a session.
      
      





これは、作業を開始する前に./bin/magento



etc/di.xml



記述子に記述されているすべてのコマンドを作成するためです。 チームを作成するために、ObjectManagerはクラス\Magento\Quote\Model\QuoteManagement



、実装インターフェース\Magento\Quote\Api\CartManagementInterface



ます。 このクラスの依存関係を作成する過程で、ObjectManagerは次の行があるコンストラクターに\Magento\Framework\Session\SessionManager



を作成します。







 $this->start();
      
      





何らかの理由(たとえば、 市外局番が設定されていない)でセッションが開始されない場合、例外がスローされ、CLIコマンドの実行がクラッシュします。 そして、コマンドを実行するときにセッションを使用しなかったことはまったく問題ではありません(または、そこに何かを作成する必要があるため、必要なインターフェイスを実装する何かを作成すると飛び出すとは思わなかった)このモードでは開始されないリソース)。







ObjectManagerによる作成中にオブジェクトのそのような非コーシャの動作に直面したMagento 2開発者は、単純なソリューション-プロキシクラスになりました。 \Magento\Quote\Api\CartManagementInterface



ではなく、コンストラクターで依存関係をコンストラクターで指定するだけで十分です。 \Magento\Quote\Api\CartManagementInterface\Proxy



)、実装されたメソッドの最初の使用時に直接実装を作成します。







つまり、インターフェイスまたはクラスの名前\Proxy



後に追加するだけで十分です。







 public function __construct(\Magento\Quote\Api\CartManagementInterface\Proxy $cartManagement) {}
      
      





コマンドの実行に関する問題がどのように解決されるか(解決しない場合は、ポンプアップされたものをクリーンアップします: rm -fr ./var/cache/* ./var/generation/*



)。 \ClassA\Proxy



ClassB\Proxy



、...、 \Magento\Quote\Api\CartManagementInterface\Proxy



好みのレベルを選択します。







Alan Stormには「 Magento 2 Object Manager:Proxy Objects 」という優れた記事がありますが( Magento 2には多くの優れた記事があります)、Magento 2でプロキシデコレータが作成された理由とその範囲についてはよくわかりませんでした彼らのアプリケーション。 アプリケーションを本番モードに移行できない場合にのみ







 $ ./bin/magento deploy:mode:set production
      
      





一部のデザイナーの危険な振る舞いにより、Magento 2のプロキシクラスの範囲を自分である程度明確にしました。








All Articles