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

@Marius에게 감사드립니다 .XML lessFileSourceBase로 제한되는지 또는 외부에서도 사용할 수 있는지 궁금합니다 . 내가 더 잘 파는 것 같아요.
David Manners

답변:


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'가되도록 구성합니다. 가상 유형을 사용하면 서브 클래스 만 해당 인수 값을 갖는 서브 클래스에 해당하는 항목을 작성할 수 있습니다.

코드베이스에는 다음 두 가지 구성이 있습니다.

<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네임 스페이스를 변경 하는 가상 유형을 작성하고 두 번째 스 니펫은 가상 유형을에 삽입합니다 Magento\Framework\Session\Generic. 이것은 Magento\Framework\Session\Generic의존성을 선언하는 다른 클래스에 영향을 미치지 않고 사용자 정의 할 수 있습니다Magento\Framework\Session\Storage


감사합니다
@Chris

그것은 간단하고 최고의 데모였습니다.
Umar

이 답변은 Magento 공식 문서
Suman-PHP4U보다

<type>실제로 존재하지 않는 가상 클래스를 사용하고 있습니다. 이런 식으로 인수 수정 virtualType은 virtualType을 사용하는 클래스가 초기화 될 때만 적용됩니다 ( Magento\Framework\Session\Generic예제
Arif Ahmad

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 가상 유형에 대한 앨런 스톰의 기사를 읽고 제안 - http://alanstorm.com/magento_2_object_manager_virtual_types/


1
좋은 확장,
Anand Ontigeri

이해하기 쉬운. 이러한 기본 예제를 공유해 주셔서 감사합니다.
Kalyan Chakravarthi V

10

같은 di.xml파일 lessFileSourceBase에서 인수로 전달 된 것을 찾았습니다. 이 lessFileSourceBaseFiltered인수로 lessFileSourceBaseSorted전달되어 type에 대한 인수로 전달되었습니다 Magento\Framework\Less\File\Collector\Aggregated.

코어 모듈을 제외하고 다른 파일에서 lessFileSourceBase(또는 lessFileSource)가 발견되지 않았습니다 di.xml. 일부 캐시 파일에만 있지만 중요하지는 않습니다.

PHP 클래스에서 가상 유형을 사용하지 않고 dixml 파일 에서만 가상 유형을 사용 하지 않으면 클래스 이름처럼 보이게 할 필요가 없으며 별칭을 사용할 수 있습니다.

그러나 이것은 순수한 추측 일뿐입니다.
클래스를 생성하고 생성자에 인스턴스가 lessFileSourceBase어떻게 작동하는지 확인하는 것은 "재미" 입니다.


1
당신은 단어 재미 주위에 따옴표를 놓쳤다;)
David Manners

1
@DavidManners. 권리. 나는 그것을 고쳤다. :)
Marius

@Marius : 대신 \Magento\Framework\Session\Generic소스 파일을 변경 하면 'Class Magento \ Core \ Model \ Session \ Storage가 없습니다'예외가 발생합니다. ObjectManager가 virtualType의 인스턴스를 작성하지는 않지만 virtualType 정의에서 참조하는 구체적 유형의 생성자 ( 위 예제의 경우) 에 제공 할 인수를 판별하기 위해 사용합니다 . Magento\Core\Model\Session\StorageStorageInterfaceMagento\Framework\Session\Storage
Chris O'Toole

팩토리에서 이것을 볼 수 있습니다 . 여기서 $requestedType가상 유형을 나타내고 인수를 수집하는 데 사용되지만 $typevirtualType이 맵핑하고 오브젝트 인스턴스화 호출에 사용되는 구체적 유형입니다.
Chris O'Toole

따라서 lessFileSourceBase더 네임 스페이스 / 클래스 유형 스타일이더라도 di.xml을 통한 주입을 위해 다른 PHP 클래스에서 직접 참조 할 수는 없습니다.
Chris O'Toole
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.