Plugin untuk magic getter / setter

9

Saya mencoba menjadikan status ulasan sebagai approvedganti pendingketika pengguna mempostingnya di frontend di Magento 2.
Dan saya mengambil pendekatan ini. Buat sebuah plugin sebelumnya, hanya tersedia di daerah frontend, untuk metode setStatusIduntuk Magento\Review\Model\Reviewyang terlihat seperti ini

public function beforeSetStatusId(\Magento\Review\Model\Review $review, $status)
{
    return [\Magento\Review\Model\Review::STATUS_APPROVED];
}

Bagi saya itu ide yang bagus. Dan itu akan berhasil karena saya mengembalikan status yang disetujui. Metode aktual kemudian harus mengambil ini sebagai parameter.
tapi yang mengejutkan saya itu tidak berhasil.
Kemudian saya menggali dan menemukan bahwa metode setStatusIdini tidak ada dalam model ulasan. Ini disebut secara ajaib dan benar-benar berjalan setData('status_id', $status).
Saya melihat kemudian di interceptor yang dihasilkan, dan memang tidak ada setStatusIdmetode.

Bagaimana saya bisa memasang magic getter / setters di magento 2? Apakah itu mungkin?

Catatan: Saya tidak memerlukan solusi untuk membuat ulasan disetujui secara otomatis. Saya tahu saya bisa mengambil pendekatan lain, seperti save_beforeacara. Ini tidak penting untuk saat ini.

Marius
sumber

Jawaban:

14

Apakah itu mungkin?

Iya.

Bagaimana saya bisa memasang magic getter / setters di magento 2?

Dengan cara yang sama seperti metode publik lainnya. Anda perlu mendeklarasikan plugin dalam di.xmlkonfigurasi dan menambahkan Anda kode kustom dalam plugin.

public function before__call(\Magento\Review\Model\Review $review, $method, $args)
{
    if ($method == 'setStatusId') {
        if (isset($args[0])) {
            $args[0] = \Magento\Review\Model\Review::STATUS_APPROVED;
            return [$method, $args];
        }
    }
    //leave everything unchanged
    return null;
}

Tapi pluginization dari kelas DTO bukan ide yang baik Cobalah untuk menyesuaikan pengontrol / layanan yang sesuai untuk memodifikasi perilaku aplikasi dan jangan menambahkan plugin pada objek DTO. Kustomisasi ini akan menghancurkan lapisan aplikasi . Saya mengerti, bahwa Anda menggunakan cara yang paling cepat dan mudah, tetapi dalam beberapa kasus itu adalah strategi yang salah.

Maks
sumber
Saya setuju dengan Anda tentang penyesuaian. Ini hanya bukti konsep.
Marius
@Marius ya, keren
Max
Saya mengambil pendekatan ini, tetapi ini akan gagal ketika / jika modul peninjauan mendapat refactored untuk menggunakan kontrak layanan. Tidak apa-apa untuk saat ini. Terima kasih.
Marius
ya, tentu, tetapi pertanyaan Anda adalah "Bagaimana saya bisa pluginize para pengambil sihir / setter di magento 2? Apakah itu mungkin?". Opsi terbaik adalah menggunakan plugin hanya untuk metode dan layanan api publik, tetapi dalam beberapa modul magento tidak ada API atau buruk.
Maks.
4

Saya pernah punya masalah yang sama. Saya berakhir dengan pluginize -metode setData(), meskipun menurut saya yang menghasilkan pemborosan sumber daya yang luar biasa ... :-(

Giel Berkers
sumber
Baik. ini adalah pendekatan yang berhasil. +1. Tapi saya berharap untuk opsi yang lebih bersih (asalkan ada satu).
Marius
Saya berharap hal yang sama. Saya masih menangis sampai tidur setiap malam karena perbaikan ini terlihat sangat kotor. Saya pikir bahwa seluruh alasan masih ada metode ajaib adalah karena kode warisan Magento 1. Saya pikir selama model ulasan belum di refactored ke model data Anda kurang beruntung untuk yang satu ini.
Giel Berkers
Saya menyadari bahwa itu karena kode warisan. Dan saya belajar pelajaran yang bagus dari ini. Jangan mengandalkan sihir untuk modul CRUD khusus.
Marius
Saya mengambil pendekatan yang dijelaskan oleh Max di sini terutama karena plugin saya akan dipanggil hanya ketika magic setter dipanggil dan tidak untuk semua setDatapanggilan. Ini tidak sempurna tetapi sedikit lebih baik daripada menggunakan setData. Mungkin Anda bisa mengubah pendekatan Anda dan tidur sedikit lebih baik di malam hari. :)
Marius