Timpa kelas proxy Magento 2

8

Saya perlu mengganti kelas \Magento\Catalog\Model\Product\Linkmenggunakan preferensi, yang berfungsi dengan baik, tetapi kelas yang disebutkan di atas memiliki kelas proxy yang dihasilkan secara otomatis \Magento\Catalog\Model\Product\Link\Proxy, yang tidak termasuk metode baru yang ditambahkan dalam penggantian. Apakah ada cara kita dapat menyuntikkan metode tersebut di kelas proxy?

EDIT

Saya telah mencoba menggali ini dan menemukan bahwa kami dapat menyuntikkan proxy menggunakan di.xml. Tetapi ketika saya mencoba melakukan itu, saya mendapat pengecualian bahwa kelas Package\Module\Model\Class\Proxytidak ada. Itu berarti proxy baru yang saya coba hasilkan tidak dihasilkan secara otomatis.

Taral Patoliya
sumber
Taral, apakah instance Magento Anda disetel ke mode pengembang? Jika tidak, Anda perlu mengkompilasi di agar proxy dihasilkan.
Ivan Chepurnyi
Mengapa Anda menambahkan metode ke kelas ini?
KAndy
Ivan, contoh
magento
@KAndy saya perlu menambahkan fungsionalitas yang tepat sebagai produk terkait, jadi untuk melakukan itu, saya perlu menambahkan beberapa metode untuk jenis tautan baru. seperti yang saya perhatikan setiap jenis tautan (terkait, cross_sell, jual-atas) memiliki metode mereka sendiri di kelas itu.
Taral Patoliya
tidak bisa Anda hanya membuat kelas proxy dengan tangan dan ditetapkan dalam di.xmlpreferensi untuk \Magento\Catalog\Model\Product\Link\Proxyke Package\Module\Model\Class\Proxy?
Marius

Jawaban:

5

Setelah membaca komentar yang Anda nyatakan:

Saya telah melakukan hal serupa dan berhasil. Saya sudah puas dengan solusi itu. tetapi saya ingin menghasilkan kelas proksi baru yang menyertakan metode baru. Sebagai kelas proxy digunakan untuk mengurangi beban inisialisasi kelas. sekarang karena kelas proxy tidak lagi digunakan, kelas asli akan mengambil lebih banyak beban server. tetapi saya pikir itu diabaikan.

Seluruh masalah yang Anda coba selesaikan, dapat dilakukan dengan cara yang lebih elegan dan tidak terlalu menyakitkan.

Jika Anda baru saja menambahkan metode baru ke implementasi yang sudah ada itu berarti Anda tidak mengubah perilaku kelas asli

  1. Anda harus menghindari memperluas metode publik dari kelas yang ada demi menciptakan kelas Anda sendiri yang menggunakan kelas asli sebagai ketergantungan
  2. Kemudian lulus kelas Anda di tempat Anda menggunakan yang asli

Ini memberi Anda manfaat samping seperti:

  1. Anda kode lebih mudah untuk mengujinya (ketergantungan tunggal lebih dari mengejek semua dependensi inti)
  2. Itu tidak melanggar prinsip tanggung jawab tunggal
  3. Itu tidak mempengaruhi inti di tempat-tempat yang tidak Anda harapkan
  4. Ini memisahkan logika bisnis Anda dari implementasi inti
Ivan Chepurnyi
sumber
2

Saya berhasil membuat Proxy.phpfile yang benar yang menyertakan fungsi baru saya dengan menambahkan berikut ini ke modul sayadi.xml

<type name="Magento\Catalog\Model\Product">
    <arguments>
        <argument name="productLink" xsi:type="object">Package\Module\Model\Product\Link\Proxy</argument>
    </arguments>
</type>

Terima kasih @minlare atas bantuannya

BroopDias
sumber