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/magentoetc/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\ProxyClassB\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のプロキシクラスの範囲を自分である程度明確にしました。



Source: https://habr.com/ru/post/J317162/


All Articles