Apa Kelas yang “Dapat dicegat / mampu-plugin” di Magento 2

17

Tanggal: 30 Mei 2015 (mengingat sifat Magento 2 yang berubah).

Magento 2 memperkenalkan konsep plugin , diimplementasikan melalui pola interseptor .

Apa yang tidak jelas dari dokumen adalah - kelas dan objek mana di Magento yang "mampu mencegat"? Artinya, Anda mengkonfigurasi plugin dengan XML yang terlihat seperti berikut ini

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

tetapi tidak jelas kelas mana yang valid sebagai ObservedType. Ini artikel wiki tua memberikan beberapa petunjuk ketika ia mengatakan

Harap dicatat bahwa fitur plugin tidak berlaku untuk - Kelas yang dibuat tanpa injeksi ketergantungan, yaitu, dibuat dengan operator baru secara langsung, -Final metode, -Final kelas

Apakah ada objek yang dibuat melalui injeksi dependensi yang tersedia untuk dicegat? Apakah ObservedTypekebutuhan untuk menjadi petunjuk tipe yang disediakan dalam suatu __constructmetode, atau bisakah itu (haruskah) menjadi sesuatu yang lain?

Terutama mencoba mencari tahu apa yang bisa dan tidak bisa dilakukan dengan pencegat Magento 2 sebelum saya mulai menggunakannya.

Alan Storm
sumber

Jawaban:

10

Setiap Kelas Modul Magento dapat saling ditukar.

Seperti yang dijelaskan pada wiki saat ini, dibatasi oleh metode dan kelas akhir

Tidak divalidasi, tetapi Kelas perpustakaan (direktori lib) tidak diizinkan untuk dicegat.

Keterbatasan bagaimana objek itu dibuat tidak benar lagi saya pikir, setidaknya jika autoloader dikonfigurasi dengan benar. Dan seharusnya tidak masalah karena mereka tidak dibuat dengan cepat, tetapi ketika generator dieksekusi. (jadi itu hanya masalah, autoloader magento harus menjadi yang pertama)

Flyingmana
sumber
2
Kami tidak memiliki batasan untuk intersepsi kelas lib. Juga agar objek dapat dicegat, harus dibuat dengan ObjectManager (injeksi konstruktor).
Anton Kril
1
Perlu dicatat bahwa metode ajaib (tetapi dideklarasikan menggunakan phpdoc) tidak dapat dicegat. Kupikir. Gaya Varien_Object masih ada di beberapa tempat.
nevvermind
11

Kami sedang mengerjakan anotasi "@api" untuk membubuhi keterangan metode yang direkomendasikan yang akan lebih stabil di seluruh rilis. Jika Anda khawatir tentang peningkatan kemampuan, sebagai tambahan terhadap apa yang dapat ditentukan oleh sebuah plugin, Anda juga harus mempertimbangkan apa yang seharusnya menentukan suatu plugin. Kami tidak merekomendasikan intersepsi metode non-api, tetapi kadang-kadang kami tahu itu mungkin pilihan terbaik. (Kami menyerahkannya pada kebijaksanaan pengembang.)

Secara resmi, Anda dapat mencegat metode publik yang tidak final. Metode pribadi pasti tidak akan berhasil. Dari memori, intersepsi saat ini bekerja dengan menciptakan kelas turunan yang mewarisi kelas nyata (kerangka kerja injeksi ketergantungan menciptakan instance dari kelas yang dihasilkan ketika Anda meminta instance baru dari kelas nyata). Jadi apa pun yang akan memungkinkan sub-kelas untuk dibuat dan metode asli yang ditimpa mungkin akan berfungsi, tetapi metode publik direkomendasikan, memberi kami fleksibilitas untuk menggunakan beberapa implementasi pintar lainnya di masa depan (yang tidak akan pernah terjadi menjadi realistis tanpa alasan yang baik) .

Alan Kent
sumber
5

Saya tahu ini sudah memiliki jawaban, tetapi berasal dari 2 tahun yang lalu. Mungkin beberapa hal berubah sementara itu.

Inilah yang saya temukan sejauh ini.
Dari dokumentasi resmi dan dari penggalian ke dalam proses intersepsi.

Saya akan menjawab sebaliknya.
Apa yang TIDAK BISA dicegat di Magento 2.
Dari dokumen resmi

  • Objek yang dipakai sebelum Magento \ Framework \ Interception di-bootstrap (tidak yakin di mana titik itu berada)
  • Metode terakhir
  • Metode apa pun dari kelas akhir (karena kelas pencegat yang dihasilkan harus memperpanjang kelas asli)
  • Setiap kelas yang mengandung setidaknya satu metode publik akhir
  • Metode non-publik (bisa digunakan untuk metode yang dilindungi tetapi ini tidak "etis" karena akan mengekspos metode non-publik ke luar kelas)
  • metode statis
  • __membangun
  • Jenis virtual

Dari menggali sekitar

  • metode di kelas yang tidak dipakai melalui object manager. (Contoh \Magento\Framework\Phrase)
  • implementasi kelas \Magento\Framework\ObjectManager\NoninterceptableInterface. (Misalnya \Magento\Framework\App\Cache\Proxydan semua proksi yang diautogenerasi lainnya)
Marius
sumber