typeとvirtualTypeの違いは何ですか


41

di.xmlMagento2が付属して、そのノードがありtype、ノードがvirtualType。私の質問は、これは何でvirtualTypeあり、どのような場合に代わりに使用すべきtypeですか?

一部の場所では、シンボリックリンクまたは書き換えのように見えます。

<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">

あるフルパスが別のフルパスに変更されるが、他の場所では、短いエイリアスを定義する方法として使用されるようです。

<virtualType name="lessFileSourceBase" type="Magento\Framework\View\File\Collector\Base">

3
それらの意味すらわかりませんが、ここから掘り始めることができますMagento\Framework\ObjectManager\Config\Mapper\Dom::convert。ありますswitchが、どこかでステートメントが。
マリウス

@Mariusに感謝します。xmlにlessFileSourceBase限定されているのか、それとも外部でも使用できるのか疑問に思っています。掘るほうがいいと思う。
デビッドマナーズ

回答:


83

仮想タイプは、他のクラスに影響を与えることなく、既存のクラスに異なる依存関係を注入する方法です。

たとえば、Magento\Framework\Session\Storageクラスは$namespaceコンストラクタの引数を取ります。この引数のデフォルトは値「default」であり、type定義を使用して名前空間を「core」に変更できます。

<type name="Magento\Framework\Session\Storage">
    <arguments>
        <argument name="namespace" xsi:type="string">core</argument>
    </arguments>
</type>

上記の構成は、すべてのインスタンスのMagento\Framework\Session\Storage名前空間が 'core'になるようにします。仮想タイプを使用すると、サブクラスに相当するものを作成できます。サブクラスのみが変更された引数値を持ちます。

コードベースには、次の2つの構成があります。

<virtualType name="Magento\Core\Model\Session\Storage" type="Magento\Framework\Session\Storage">
    <arguments>
        <argument name="namespace" xsi:type="string">core</argument>
    </arguments>
</virtualType>

<type name="Magento\Framework\Session\Generic">
    <arguments>
        <argument name="storage" xsi:type="object">Magento\Core\Model\Session\Storage</argument>
    </arguments>
</type>

最初のスニペットはMagento\Core\Model\Session\Storageネームスペースを変更する仮想タイプを作成し、2番目は仮想タイプをに挿入しMagento\Framework\Session\Genericます。これによりMagento\Framework\Session\Generic、依存関係も宣言する他のクラスに影響を与えずにカスタマイズできます。Magento\Framework\Session\Storage


どうもありがとう@クリス私が見つけた最終的にいくつかの論理的正当化
スマン-PHP4U

それは簡単で最高のデモンストレーションでした。
ウマル

この答えは、より良いそして、Magentoの公式ドキュメントである
スマン-PHP4U

<type>実際には存在しない仮想クラスを使用しています。引数の変更では、この方法virtualTypeでvirtualTypeを使用してクラスが初期化されるだけ有効になりますMagento\Framework\Session\Generic例に
アリフアフマド

21

仮想タイプを理解する別の方法-

\Class1次のコンストラクタを持つclassを持っているとしましょう-

public function __construct(\Class2 $argOfClass1){...}

そして\Class2、次のコンストラクタがあります-

public function __construct(\Class3 $argOfClass2){...}

さて、あなたはの種類を変更したい$argOfClass2から\Class3\Class4、しかしときにのみ\Class2に使用されます$argOfClass1

それを行う「古い」方法は、以下を追加することですdi.xml-

<type name="Class1">
    <arguments>
         <argument name="argOfClass1" xsi:type="object">Class5</argument>
    </arguments>
</type>

どこ\Class5次のとおりです。

class \Class5 extends \Class2{
    public function __construct(\Class4 $argOfClass2){...}
}

この方法を使用する代わりに、次を追加することにより、仮想タイプを使用して同じことを実現できますdi.xml

<virtualType name="Class5" type="Class2">
    <arguments>
        <argument name="argOfClass2" xsi:type="string">Class4</argument>
    </arguments>
</virtualType>

<type name="Class1">
    <arguments>
         <argument name="argOfClass1" xsi:type="object">Class5</argument>
    </arguments>
</type>

ご覧のとおり、仮想タイプを使用すると、の作成作業が節約されますClass5

さらに参照するには、Magento2の仮想タイプに関するAlan Stormの記事を読むことをお勧めします-http : //alanstorm.com/magento_2_object_manager_virtual_types/


1
良い追放、
Anand Ontigeri

わかりやすい。このような基本的な例を共有してくれてありがとう。
Kalyan Chakravarthi V

10

同じdi.xmlファイル内でlessFileSourceBaselessFileSourceBaseFilteredそれが引数として渡され、lessFileSourceBaseSortedそれが引数として渡され、それがtypeの引数として渡されることがわかりましたMagento\Framework\Less\File\Collector\Aggregated

コアモジュール以外のファイルでlessFileSourceBase(またはlessFileSource)が他に発生していませんdi.xml。一部のキャッシュファイルのみで、重要ではありません。

PHPクラスで仮想タイプを使用せず、dixmlファイルでのみ使用する場合は、クラス名のように見えるようにする必要はなく、エイリアスを使用できます。

しかし、これは単なる憶測です。
クラスを作成し、そのコンストラクターにインスタンスを注入して、そのlessFileSourceBase動作を確認するのは「楽しい」でしょう。


1
楽しいという言葉の周りの引用符を逃した;)
デビッドマナー14

1
@DavidManners。右。それを私が直した。:)
マリウス

@Marius:\Magento\Framework\Session\Generic依存するMagento\Core\Model\Session\Storage代わりにソースファイルを変更StorageInterfaceすると、「クラスMagento \ Core \ Model \ Session \ Storageが存在しません」という例外が発生します。その理由は、ObjectManagerはvirtualTypeのインスタンスを作成せず、virtualType定義によって参照される具象型のコンストラクターに提供する引数を決定するためにそれを使用するだけです(Magento\Framework\Session\Storage上記の例)。
クリスオツール14

これはFactory見ることができます。ここで、$requestedType仮想タイプを表し、引数を収集するために使用されますが$type、virtualTypeがマップし、オブジェクトのインスタンス化呼び出しに使用される具象タイプです。
クリスオツール14

だから、場合でも、lessFileSourceBaseより多くの名前空間\クラスタイプのスタイルにあった、それだけでdi.xmlを経由して注入するために、別のPHPクラスで直接参照を可能にしません
クリス・オトゥール
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.