Magento 2:var / generationのInterceptorsファイルとは何ですか?


24

だから私はいくつかのInterceptor.phpファイルに気づいたvar/generation

このフォルダには、次の目的でオンザフライで作成された生成クラスが含まれていることを知っています。

  • 工場
  • プロキシ
  • プラグイン

Interceptorファイルはプラグインにリンクされていると思いますが、それらのファイルがどのように生成されるか分からないことがあります。たとえば、私は持ってvar/generation/Magento/Framework/App/Response/Http/Interceptor.phpいますが、このファイルは既存のクラスと一致しないようです。

だから私はInterceptor.phpファイルがどのように生成されるかについてよく説明されたワークフローを探していますか?

回答:


32

インターセプタークラスは、インターセプターデザインパターンの実装です。インターセプターは、Magento 2のオブジェクトシステムプラグインシステムを実装する方法です。

クライアント開発者としての理論は、インターセプターを心配する必要はないということです。オブジェクトマネージャーにX型のオブジェクトを要求すると、それが返されます。要求したオブジェクトはインターセプターである場合とそうでない場合がありますが、クライアントプログラマーの観点からは、インターセプターではないバージョンと同じように動作します。オブジェクトマネージャーが実装の詳細でインターセプターを返すかどうかを決定する方法。

その実装の詳細に興味がある人-クラス、またはそのクラスの親クラスにプラグインが構成されている場合、オブジェクトマネージャーはインターセプターを返します。開発者モードのインターセプタークラスで確認できます

#File: vendor/magento/framework/Interception/ObjectManager/Config/Developer.php
public function getInstanceType($instanceName)
{
    $type = parent::getInstanceType($instanceName);
    if ($this->interceptionConfig && $this->interceptionConfig->hasPlugins($instanceName)
        && $this->interceptableValidator->validate($instanceName)
    ) {
        return $type . '\\Interceptor';
    }
    return $type;
}

本番(コンパイル済みモード)の場合、Magentoはコンパイルモード中にシステムを事前スキャンし、プラグインが必要なクラスをメモします。

実際の生成に関しては、MagentoはこれをPHPオートローダーで処理します。開発者がクラスをインスタンス化する(または、(タイプヒント、class_existsクラスなどの)クラス名でPHP自動ロードイベントをトリガーする)場合、コンポーザーベースのオートローダーがクラスファイルを見つけられない場合、2番目に登録されたオートローダー

Magento\Framework\Code\Generator\Autoloader::load

トリガーされます。このオートローダー

vendor/magento/framework/Code/Generator/Autoloader.php

Magento\Framework\Code\Generatorクラスを介して間接的に)特定の命名パターンのクラスをスキャンします。クラス名がで終わる場合Interceptor、Magento generateClassはこのクラスのメソッドを介してインターセプターを生成します

vendor/magento/framework/Code/Generator.php

から追跡する追加のクラス/オブジェクトがありMagento\Framework\Code\Generatorますが、読者のための演習として残しておきます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.