Di Magento 2, saat Anda membuat plugin "sekitar"
public function aroundRenderResult(
\Magento\Framework\Controller\ResultInterface $subject,
\Closure $proceed,
ResponseHttp $response
) {
//...
$proceed($response);
//...
}
Anda dapat melanjutkan ke plugin selanjutnya, yang berpuncak dengan memanggil metode asli yang sebenarnya, dengan memanggil / memanggil metode yang dilewatkan $proceed
. Ini adalah pola desain umum, sering terlihat dalam implementasi middleware PHP Frameworks.
Namun - itu memang menghadirkan beberapa kebingungan w / r / t untuk detail implementasi. Secara khusus
Jika, di samping sebuah
aroundPlugin
, sebuah objek / kelas memilikibefore
atauafter
plugin yang ditentukan, kapan mereka memecat sehubungan dengan rantai sekitar plugin?
yaitu apakah semua metode sebelumnya akan menyala sebelum ada metode plugin yang menyala? Atau akankah sebelum plugin hanya menembak sebelum final, metode nyata yang sebenarnya akan menyala?
Masalah khusus yang saya coba lacak adalah, sepertinya saya tidak bisa mendapatkan plugin yang terpasang pada metode pengiriman pengontrol depan Magento 2 saat Magento dalam mode caching halaman penuh . Tembolok halaman penuh beroperasi oleh plugin sekitar yang tidak memanggil $proceed($response)
. Saya sudah mencoba menggali ke dalam beberapa kode di sekitar plugin ini dan telah menemukan sistem sulit untuk dipikirkan tanpa mengetahui bagaimana maksudnya bahwa plugin bekerja.
yaitu - deskripsi pada halaman dev docs muncul, dalam satu contoh khusus ini, menjadi tidak akurat. Tidak jelas apakah dokumentasinya salah, atau apakah ini bug yang baru saja diperkenalkan, apakah ini kasus tepi, atau apakah konfigurasi plugin saya salah.
Adakah yang tahu, dengan pengamatan langsung, atau dengan pengetahuan budaya, bagaimana penentuan prioritas ini berfungsi?
sumber
\closure $proceed
vs.\callable $proceed
dalam sebuah plugin? Dokumen resmi hanya menyebutkan\callable
dan tidak pernah menyentuh\closure
.Jawaban:
Plugin diurutkan berdasarkan urutan pertama, dan kemudian dengan awalan metode.
Contoh: untuk metode dengan 3 plugin (PluginA, PluginB, PluginC) dengan metode dan sortOrder berikut:
Alur eksekusi harus mengikuti:
sumber
Dari buku masak Magento 2:
sumber
Bagi saya itu harus berfungsi sebagai:
Jika Anda meninjau kode
\Magento\Framework\Interception\Interceptor::___callPlugins()
Anda dapat melihat bahwa plugin dipanggil agar disimpan dalam$pluginInfo
variabel. Informasi ini melewati bentuk metode yang dihasilkan secara otomatis di interceptor sepertiSeperti yang Anda lihat
\Magento\Framework\Interception\PluginListInterface
antarmuka dan\Magento\Framework\Interception\PluginList\PluginList
implementasi default bertanggung jawab untuk pengurutan plugin. Lihat _inheritPlugins: 152 metodeBagi saya fungsi ini memiliki dua kesalahan logis:
return $itemB['sortOrder'];
seharusnyareturn - $itemB['sortOrder']
;return 1;
seharusnyareturn 0;
Semoga ini bisa membantu Anda.
sumber