อีกวิธีในการทำความเข้าใจประเภทเสมือน -
สมมติว่าคุณมีคลาส\Class1
ซึ่งมีตัวสร้างต่อไปนี้ -
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
ได้
สำหรับการอ้างอิงเพิ่มเติมฉันขอแนะนำให้อ่านบทความของ Alan Storm เกี่ยวกับประเภทเสมือนใน Magento2 - http://alanstorm.com/magento_2_object_manager_virtual_types/
Magento\Framework\ObjectManager\Config\Mapper\Dom::convert
. มีswitch
คำสั่งอยู่ที่นั่นที่ไหนสักแห่ง