Jadi, saya tahu secara teoritis apa yang dimaksud dengan kelas proxy di Magento 2. Saya telah membaca artikel Alan Storm yang luar biasa tentang hal itu dan saya benar-benar mengerti bagaimana kelas-kelas itu dihasilkan.
Namun, dan saya tidak tahu apakah itu karena saya bukan penutur bahasa Inggris asli atau jika penjelasan Alan menggunakan kelas non-inti yang sangat abstrak, tapi saya kesulitan memahami cara kerjanya dan khususnya kapan harus menggunakan itu selama pengembangan.
Jadi mari kita ambil contoh ini dari inti di app/code/Magento/GoogleAdwords/etc/di.xml
:
<?xml version="1.0"?>
<!--
/**
* Copyright © 2016 Magento. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\GoogleAdwords\Observer\SetConversionValueObserver">
<arguments>
<argument name="collection" xsi:type="object">Magento\Sales\Model\ResourceModel\Order\Collection\Proxy</argument>
</arguments>
</type>
</config>
Saya ingin tahu:
- mengapa kelas proxy digunakan dalam kasus khusus itu?
- kapan, secara umum, haruskah seseorang menggunakan kelas proxy?
sumber
Kelas proxy memungkinkan Anda ketergantungan-menyuntikkan kelas yang Anda tidak perlu, dan yang memiliki biaya tinggi terkait dengan melakukannya.
Jika Anda melihat proxy yang dibuat Magento, seperti
\Magento\Framework\View\Layout\Proxy
, Anda akan melihatnya memiliki semua metode yang sama dengan kelas aslinya. Perbedaannya adalah bahwa setiap kali ada yang dipanggil, ia memeriksa apakah kelas itu adalah proxy sebenarnya telah dipakai, dan membuat objek jika tidak. (Ini terjadi dalam_getSubject()
atau_getCache()
metode.)Pemuatan malas untuk injeksi ketergantungan.
Anda harus menggunakan proxy jika ketergantungan kelas tidak selalu digunakan oleh kelas Anda, dan:
Salah satu contoh yang baik dari ini adalah sesi. Mendapatkan sesi melalui ObjectManager adalah praktik yang buruk, tetapi menyuntikkan kelas sesi seperti
\Magento\Customer\Model\Session
dapat merusak hal-hal jika kelas Anda pernah berjalan di luar ruang lingkup sesi itu (misalnya Anda menyuntikkan sesi pelanggan frontend pada halaman admin). Anda menyiasatinya dengan menyuntikkan proksi sesi\Magento\Customer\Model\Session\Proxy
sebagai gantinya, dan hanya merujuk ketika Anda tahu itu valid. Kecuali Anda referensi, sesi tidak pernah dipakai, dan tidak ada yang rusak.Dalam contoh spesifik Anda
di.xml
, sepertinya mereka menggunakan proksi untuk membenarkan menyuntikkan pengontrol daripada pabrik pengontrol itu. Either way, bukan itu yang dimaksudkan untuk menggunakan proxy, dan manfaatnya dalam situasi itu kemungkinan minimal.sumber
Proxy autogenerated tipe Magento 2 dapat digunakan untuk "memperbaiki" kesalahan desain. Itu bisa sangat berguna. Ada 2 kasus penggunaan:
Bungkus grafik objek mahal yang mungkin tidak diperlukan setiap saat oleh tanggungan.
Hancurkan ketergantungan siklik tempat kelas
A
bergantungB
dan kelasB
bergantung padaA
.Menyuntikkan
B\Proxy
ke dalamA
memungkinkan Anda instantiateA
, yang kemudian dapat digunakan untuk instantiateB
ketika itu benar-benar digunakan denganA
objek nyata .Dalam kasus 1. ketergantungan yang tidak selalu digunakan adalah tanda bahwa kelas tanggungan melakukan banyak hal, atau mungkin melakukan banyak hal dengan satu metode. Perintah konsol @ivan yang disebutkan adalah contoh yang bagus.
Dalam kasus 2. Saya tidak tahu cara umum untuk memecah ketergantungan itu. Saya cenderung menulis ulang jika ada waktu, tetapi itu mungkin bukan pilihan.
Sama seperti catatan tambahan, saya ingin menambahkan bahwa ada lebih banyak jenis proxy dalam OOP daripada instantiasi malas autogenerated yang digunakan Magento 2 (mis. Proxy jarak jauh).
sumber
Inilah jawabannya
mengapa kelas proxy digunakan dalam kasus khusus itu?
Jika Anda melihat dari dekat kode di bawah ini yang ditulis untuk kelas "SetConversionValueObserver", jika Google adwards tidak aktif "kembali" dan jika tidak ada pesanan "kembali". Berarti, Objek Pengumpulan Pesanan akan dibuat hanya jika Id ada dan Google adwords aktif. jika kita menyuntikkan kelas koleksi pesanan aktual maka manajer objek membuat objek koleksi dengan objek kelas induknya tanpa mengetahui Google adwords tidak aktif dan memperlambat halaman keberhasilan pesanan. jadi, lebih baik buat objek sesuai permintaan yaitu penggunaan proxy. /vendor/magento/module-google-adwords/Observer/SetConversionValueObserver.php
kapan, secara umum, haruskah seseorang menggunakan kelas proxy? - Suntikkan kelas Proxy ketika Anda merasa pembuatan objek akan mahal dan konstruktor kelas sangat membutuhkan sumber daya. - ketika Anda tidak ingin dampak kinerja yang tidak perlu karena pembuatan objek. - ketika Anda merasa penciptaan objek harus terjadi ketika Anda memanggil metode tertentu dalam kondisi tertentu tidak selalu. Misalnya konstruktor Tata Letak adalah sumber daya-intensif.
Konstruktor Tata Letak Aktual vs tata letak / proxy
Proxy konstruktor, lihatlah, tidak ada induk konstruktor yang dipanggil serta hanya melewati nama kelas tata letak sehingga penciptaan objek aktual terjadi ketika metode dipanggil.
Kelas proxy memiliki metode untuk membuat objek sesuai permintaan, _subjek adalah objek dari kelas yang lulus.
Dan metode yang disebut menggunakan _subject.
sumber