Quando inviare eventi in un modulo personalizzato?


14

Questa è una domanda riguardante Magento 1 e Magento 2.

Comprendo che, come buona prassi, gli sviluppatori di moduli di terze parti sono incoraggiati a inviare eventi nel loro modulo personalizzato per semplificare il lavoro con altri moduli.

Mi piacerebbe sapere:

  • dove uno sviluppatore dovrebbe inviare eventi in un modulo personalizzato?
  • c'è qualche posto consigliato per l'invio di eventi? Ad esempio controllori, modelli, blocchi, aiutanti, osservatori?
  • in che modo gli eventi di dispacciamento influiscono sulle prestazioni?

sì! buona domanda. qualcuno per favore rispondi a questa domanda. Sarà molto utile per gli sviluppatori di estensioni di terze parti e per i progetti personalizzati.
mapaladiya,

Risposte:


10

Non troverai una risposta buona, chiara e deterministica qui. In generale, dovresti inviare eventi nel tuo modulo dove tu e i tuoi utenti ne hanno bisogno - se non riesci a pensare a dove potrebbero essere necessari, non è necessario inviarli. Magento stesso emette così tanti eventi in così tanti luoghi diversi (spedizione pre / post del controller, qualsiasi operazione crud, ecc.) Che il tuo modulo invierà già un certo numero di eventi utili senza che tu faccia nulla.

Poiché ciò non è soddisfacente, vorresti che il tuo modulo inviasse un evento quando c'è qualche azione che il tuo modulo intraprende a cui i tuoi utenti potrebbero voler aggiungere elementi, eliminare elementi, cambiare o intraprendere un'azione separata indipendentemente dall'azione originale. Ad esempio: Magento ha un visitor_initevento che non fa parte della sua suite standard di eventi generati automaticamente. Questo evento consente ai programmatori di modificare l'oggetto visitatore prima che Magento registri i dati. Non era in alcun modo che gli sviluppatori del modulo originale lo sapessero in modo deterministicoè qui che è necessario aggiungere un evento, probabilmente derivante da richieste di funzionalità e / o interviste con utenti di sistema. Scopri cosa vogliono i tuoi utenti e, se non è possibile / pratico creare una UI / UX per lasciarli fare tramite l'amministratore, aggiungi un hook di evento in modo che un altro programmatore possa farlo per loro.

Meno sensualmente, l'aggiunta di eventi può anche essere un modo economico per consentire agli sviluppatori (sia i tuoi utenti, sia il tuo team) di aggiungere alcune funzionalità in un pezzettino di codice che tutti hanno paura di toccare. Effettua la dispatchEventchiamata nel mezzo del codice, aggancialo e puoi aggiungere la tua funzionalità senza disturbare il codice nell'ambito originale. [Editor: anche tu dovresti refactoring quel codice terribile ad un certo punto]

Per quanto riguarda le prestazioni, l'aggiunta di un evento alla spedizione dipenderà da dove lo aggiungi. Quando si chiama un dispatchevento, Magento deve effettuare alcune chiamate PHP aggiuntive, interrogare la configurazione per eventuali osservatori configurati e quindi chiamare gli osservatori. Fatto una volta, si tratta di un'aggiunta economica nell'ambito di una spedizione Magento standard. Tuttavia, fatto ripetutamente, (diciamo, prima di ogni rendering di blocco) questo può sommarsi. Non c'è una buona regola empirica qui - come sempre la risposta giusta è profilo.

Infine, con Magento 2, è ancora troppo presto per dirlo. Tutto quanto sopra vale ancora, tuttavia il sistema di plugin aggiunge alcune rughe. I plug-in sono, da un punto di vista, un modo per creare comportamenti simili a eventi per qualsiasi chiamata di metodo pubblica in Magento. In teoria, se stai progettando correttamente le tue lezioni, non dovresti mai aver bisogno di un evento. Tuttavia, in pratica, trascinare un evento in un po 'di codice di metodo protetto o privato sarà una soluzione allettante per gli sviluppatori Magento quando l'alternativa è un lungo processo di refactoring. Inoltre, la creazione di un evento con un nome specifico può spesso creare un'esperienza più amichevole per gli sviluppatori che utilizzano il modulo.

Spero possa aiutare!


9

Per Magento 1, i momenti migliori per lanciare eventi sono prima e dopo tutte le operazioni CRUD e prima e dopo il rendering. Molti di questi sono già forniti dalle classi astratte nel nucleo, quindi in pratica non sono necessari molti eventi di terze parti.

Con Magento 2 la situazione è diversa. Poiché le chiamate al metodo pubblico possono essere intercettate con i plug-in, gli eventi personalizzati non sono più necessari.
Quando si progettano le classi, anziché semplicemente rendere pubblico ogni metodo in modo che possa essere intercettato, è meglio scomporre una grande classe in più classi più piccole.
Ciascuna delle classi più piccole potrebbe quindi avere uno o due metodi pubblici ben definiti e accettabili.


0

Come ha detto Vinai, prima / dopo le operazioni CRUD. Un altro posto importante per l'invio di eventi è nei blocchi di modulo adminhtml (se applicabile). In questo modo puoi aggiungere nuovi campi di input se hai aggiunto attributi / campi personalizzati senza dover riscrivere i blocchi del modulo di amministrazione. (Questo è per Magento 1). vedi esempio


0

All'interno di Magento 1, puoi sfruttare gli eventi attraverso gli eventi generati automaticamente che si verificano. Tutto quello che devi fare è impostare un $_eventPrefixe le $_eventObjectproprietà sui tuoi modelli. Inoltre, vengono generati automaticamente eventi controller controllati tramite gli eventi 'controller_action_predispatch_ ' . $this->getFullActionName()e 'controller_action_postdispatch_' . $this->getFullActionName()sul controller. Quelli possono farti arrivare fin lì.

Per Magento 2, mantieni i tuoi metodi pubblici all'interno delle tue classi. Ciò consente ai plug-in di intercettare i tuoi metodi. Se segui questo, non dovrai creare eventi personalizzati.

Spero che questo possa essere d'aiuto!

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.