Magento 1 Kelas Menulis Ulang dalam Magento 2 dengan Sistem Injeksi Ketergantungan

10

Mengaduk- aduk kode inti Magento 2 , sepertinya sistem penulisan ulang kelas lama telah dicabut dan diganti dengan sistem injeksi ketergantungan baru.

Sayangnya, tidak ada dokumentasi untuk sistem baru ini.

Apakah ada yang punya sampel konfigurasi modul yang akan memungkinkan pengguna, di Magento 2, "menulis ulang" kelas Mage_Catalog_Model_Productdengan kelas baru Packagename_Modulename_Model_Product, menggunakan sistem injeksi ketergantungan baru?

Alan Storm
sumber
Saya pikir pertanyaan Magento 2.0 belum diizinkan meta.magento.stackexchange.com/questions/79/…
Marius

Jawaban:

10

Konfigurasi Di dipindahkan ke file di.xml, dan formatnya dimodifikasi. Sekarang preferensi terlihat seperti ini (di.xml):

<config>
    <preference for="{Interface_Or_Class_Name}" type="{Preferred_Class_Name}" />
</config>
Anton Kril
sumber
jika itu adalah penulisan ulang kelas, apakah lebih baik menggunakan plugin daripada node preferensi?
huzefam
2
Jika Anda perlu mengganti perilaku beberapa kelas inti, Anda harus menggunakan preferensi. Jika Anda perlu mengganti perilaku beberapa metode inti, Anda harus menggunakan plugin dengan sekitar pendengar yang tidak akan memanggil $ melanjutkan (). Jika Anda perlu menambahkan perilaku ke beberapa metode inti atau kelas, Anda harus menggunakan plugin.
Anton Kril
5

Bekerja dari dalam ke luar, saya bisa mendapatkan penulisan ulang dengan berikut ini

<global>    
    <di>    
        <preferences>
            <Mage_Catalog_Model_Product>Packagename_Modulename_Model_Product</Mage_Catalog_Model_Product>
        </preferences> 
    </di>
</global>

Namun, ada lebih banyak kode sistem dalam implementasi injeksi dependensi, jadi tidak jelas apakah di atas akan berfungsi dalam versi Magento 2 yang dirilis akhir.

Alan Storm
sumber
Jadi sepertinya mereka pada dasarnya mengganti nama "alias" menjadi preferensi dan memindahkannya ke atas? Menarik. Saya menantikan untuk melihat pembaruan untuk peluncuran dokumentasi. Peter mengatakan mereka memilikinya, tetapi semuanya belum didorong ke situs dokumen, setidaknya IIRC.
davidalger
5

Anda benar, penulisan ulang kelas sepenuhnya dihilangkan dan diganti dengan DI. Catatan berikut berasal dari bagian tentang perubahan Kerangka Aplikasi :

Magento 1.x - Node: / global // {sub-path yang sesuai dengan nama pabrik + "menulis ulang" literal}

<global>
...
    <models>
        <core>
            <rewrite>
                <url>My_Module_Model_Url</url>
            </rewrite>
        </core>
    </models>
...
</global>

Magento 2.x - Node: / global / di / aliases

<global>
...
    <di>
        <aliases>
            <Mage_Core_Model_Url>My_Module_Model_Url</Mage_Core_Model_Url>
        </aliases>
    </di>
...
</global>

Saya belum mencoba memanfaatkan ini dalam modul yang berjalan di Magento 2.0, tetapi tampaknya Anda pada dasarnya mendefinisikan alias untuk nama kelas alih-alih menggunakan hierarki rumit xml untuk penulisan ulang per-modul.

davidalger
sumber
1
+1 untuk halaman Kerangka Kerja Aplikasi, tetapi ini tidak berfungsi dalam snapshot Magento 2 terbaru yang saya ambil.
Alan Storm