Magento 2でファクトリーの生成をトリガーするもの


39

Magento 2には、事前に生成された、またはその場で生成された多くのクラスファイルが含まれています。彼らが住んでいます

var/generated

これらの生成されたファイルには、ファクトリクラスが含まれます。ドキュメントからプログラマーはファクトリクラスを使用して「注入不可能な」オブジェクトをインスタンス化することを理解しています。「非注入可能」オブジェクトとは、通常、インスタンス化にユーザー入力が必要なため、依存性注入を介して追加できないオブジェクトです__constructor

ドキュメントから明らかでないのは、Magento 2がファクトリクラスを生成する必要があることをどのように認識するかです。このビット

ランタイムモードまたはコンパイラのオブジェクトマネージャが存在しないファクトリに遭遇した場合、オブジェクトマネージャはファクトリを生成します。

オブジェクトマネージャー(または拡張機能により、依存関係の挿入__constructors)でファクトリクラスを使用すると、Magento 2がそれを生成するように聞こえます。しかし、オブジェクトマネージャーは、私が要求しているのがファクトリーであることをどのようにして知るのでしょうか?

また、生成されたすべてのクラスを自動的に生成(または「コンパイル」)するための2つの コマンドがあるようです。これらのコマンドのいずれかを実行すると、多数のファクトリクラスが生成されます。 必要なファクトリオブジェクトを生成するために、これらのコマンドはどの構成ファイルやコードファイルを調べていますか?

オブジェクトマネージャやコマンドコードを最後までたどることでこれが明らかになることはわかっていますが、長くて骨の折れる旅を避けたいと思っています。

回答:


21

これらすべてがどのように連携するかについての興味深いコードの場所:https : //github.com/magento/magento2/blob/develop/dev/tests/integration/testsuite/Magento/Framework/Code/GeneratorTest.php#L40

主にここから来るさまざまなタイプ https://github.com/magento/magento2/tree/develop/lib/internal/Magento/Framework/ObjectManager/Code/Generatorだけでなく、ここからhttps://github.com/magento / magento2 / tree / develop / lib / internal / Magento / Framework / Interception / Code / Generator傍受コード用。

ここではすべてオートローダーによってトリガーされますhttps://github.com/magento/magento2/blob/develop/lib/internal/Magento/Framework/Code/Generator/Autoloader.php#L32

public function load($className)
{
    if (!class_exists($className)) {
        return Generator::GENERATION_ERROR != $this->_generator->generateClass($className);
    }
    return true;
}

9

ファクトリーが生成される条件はコードでは見つかりませんでしたが、私の理解では、ファクトリー・クラスは要求されて見つからないときに生成されます。特定のクラスが見つからない場合、コード生成をトリガー
する予約済みのキーワードFactory, Proxy, Interceptorが使用されている場合があります。
ファクトリ生成をトリガーするコードが見つかったらすぐにポストバックします。
したがって、クラスをリクエストしてSome\Namespace\HereFactoryもクラスが存在しない場合は、キーワードFactoryで終了するため、クラスで生成されますvar/generation/Some/Namespace/HereFactory.php


ObjectManagerは実際に生成するものではないため、ドキュメントを更新する必要があるように見えます。特別なオートローダーは答えの一部です。 github.com/magento/magento2/blob/develop/lib/internal/Magento/...
クリス・オトゥール

1
それは私の経験と並んでいます(gist.github.com/astorm/f245ce9c761c9a8053aaを参照)が、質問1が発生します。これはオブジェクトマネージャーコードのどこで発生しますか(つまり、実際の規則は何ですか)。ジェネレーターはどの工場を生成するかを知っていますか?
アランストーム

8

私は今、この同じエンドウ豆のスープを掘っています。これまでの私の理解では、自動生成されるものはすべて、で/var/generation宣言された設定とインターフェースから行われますapp/etc/di.xml

あなたのインターフェースと設定は、あなたののdi.xmlファイルで宣言されます/app/code/Vendor/<module>/etc/di.xml

オブジェクトを生成することを知って__constructorいるのは、適切なdi.xmlファイルでグローバルまたはローカルにそのインターフェイスの優先順位を宣言しているので、インターフェイスを宣言したからです。

コメントとともに3粒の塩を提供します。


有用な情報を得るために+1-しかし、ファクトリーはdi.xmlファイル以外の場所から来ているようです-オブジェクトマネージャーに何かを送信してFactoryで終了すると、ファイルが生成されます。
アランストーム

これは役立ちますか?bit.ly/1BOtdie
スティーブジョンソン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.