Plugin per getter / setter magici


9

Sto cercando di rendere lo stato di una recensione al approvedposto di pendingquando l'utente lo pubblica nel frontend in Magento 2.
E ho adottato questo approccio. Crea un plug-in precedente, disponibile solo nell'area front-end, per il metodo setStatusIdper quello Magento\Review\Model\Reviewche appare così

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

Mi è sembrato una buona idea. E dovrebbe funzionare poiché sto restituendo lo stato approvato. Il metodo effettivo dovrebbe quindi selezionarlo come parametro.
ma con mia sorpresa non ha funzionato.
Quindi ho scavato e ho scoperto che il metodo setStatusIdnon esiste nel modello di revisione. Si chiama magicamente e funziona davvero setData('status_id', $status).
Ho dato un'occhiata quindi all'intercettore generato, e in effetti non esiste un setStatusIdmetodo.

Come posso plug-in i getter / setter magici in magento 2? È anche possibile?

Nota: non ho bisogno di una soluzione per rendere le recensioni auto-approvate. So di poter adottare altri approcci, come gli save_beforeeventi. Questo non è importante per ora.

Risposte:


14

È anche possibile?

Sì.

Come posso plug-in i getter / setter magici in magento 2?

Allo stesso modo di un altro metodo pubblico. Devi dichiarare il plugin nella di.xmlconfigurazione e aggiungere il tuo codice personalizzato nel 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;
}

Ma la plug-in delle classi DTO non è una buona idea. Prova a personalizzare i controller / servizi appropriati per modificare il comportamento dell'applicazione e non aggiungere plug-in sull'oggetto DTO. Questa personalizzazione distruggerà i livelli dell'applicazione . Capisco che stai usando il modo più semplice e veloce, ma in alcuni casi è una strategia sbagliata.


Sono d'accordo con te sulla personalizzazione. Questa era solo una prova di concetto.
Marius

@ Mario sì, bello
Max

Ho adottato questo approccio, ma fallirà quando / se il modulo di revisione viene refactored per utilizzare i contratti di servizio. Va bene per ora. Grazie.
Marius

sì, certo, ma la tua domanda era "Come posso inserire plugin / setter magici in Magento 2? È anche possibile?". La migliore opzione sarebbe usare i plugin solo per metodi e servizi di API pubblici, ma in alcuni moduli magento non ci sono API o è scadente.
Max

4

Una volta ho avuto un problema simile. Ho finito con plug-in il setData()metodo, anche se a mio avviso ciò genera un enorme spreco di risorse ... :-(


Ok. questo è un approccio lavorativo. +1. Ma spero in un'opzione più pulita (a condizione che ce ne sia una).
Marius

Spero lo stesso Piango ancora me stesso a dormire ogni notte perché questa correzione sembra così sporca. Penso che l'intero motivo per cui esistono ancora metodi magici sia dovuto al codice legacy di Magento 1. Penso che fino a quando il modello di revisione non sarà ancora sottoposto a refactoring a un modello di dati, sarai sfortunato per questo.
Giel Berkers,

Mi sono reso conto che è a causa del codice legacy. E ho imparato una buona lezione da questo. Non fare affidamento sulla magia per i moduli CRUD personalizzati.
Marius

Ho seguito l'approccio spiegato da Max qui principalmente perché il mio plugin verrà chiamato solo quando viene invocato un setter magico e non per tutte le setDatachiamate. Non è perfetto ma è un po 'meglio dell'uso setData. Forse puoi anche cambiare il tuo approccio e dormire un po 'meglio di notte. :)
Marius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.