Quali classi sono "intercettabili / plug-in" in Magento 2


17

Data: 30 maggio 2015 (vista la natura mutevole di Magento 2).

Magento 2 ha introdotto un concetto di plug-in , implementato tramite un modello di intercettore .

Ciò che non è chiaro dai documenti è: quali classi e oggetti in Magento sono "intercettabili"? Cioè, si configura un plug-in con XML simile al seguente

<config>
    <type name="{ObservedType}">
        <plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
    </type>
</config>

ma non è chiaro quali classi sono valide come ObservedType. Questo vecchio articolo wiki fornisce alcuni indizi quando dice

Si noti che la funzionalità del plug-in non si applica a: - Classi create senza iniezione di dipendenza, ovvero create con l'operatore direttamente nuovo, - Metodi finali, - Classi finali

È possibile intercettare un oggetto creato tramite iniezione di dipendenza? La ObservedTypenecessità di essere il suggerimento del tipo fornito nel __constructmetodo a o può (dovrebbe?) Essere qualcos'altro?

Cercando principalmente di capire cosa può e non può essere fatto con un intercettore Magento 2 prima di iniziare a usarli.

Risposte:


10

Ogni classe di un modulo Magento è intercapabile.

Come descritto nella wiki attuale, è limitato dai metodi e dalle classi finali

Non convalidato, ma le Classi di librerie (directory lib) non possono (/ dovrebbero) essere intercettate.

La limitazione di come l'oggetto è stato creato non è più vera, almeno se il caricatore automatico è configurato correttamente. E non dovrebbe importare perché non vengono creati al volo, ma quando il generatore viene eseguito. (quindi è solo una questione di, il caricatore automatico magento dovrebbe essere il primo)


2
Non abbiamo limiti per l'intercettazione di classi lib. Inoltre, affinché l'oggetto sia accettabile, deve essere creato con ObjectManager (iniezione del costruttore).
Anton Kril,

1
Va notato che i metodi magici (ma dichiarati usando phpdoc) non possono essere intercettati. Penso. Lo stile Varien_Object esiste ancora in alcuni punti.
nevvermind,

11

Stiamo lavorando su annotazioni "@api" per annotare i metodi consigliati che saranno più stabili tra le versioni. Se ti preoccupi dell'aggiornamento, oltre a ciò che può essere definito un plug-in, dovresti anche considerare cosa dovrebbe avere un plug-in definito. Non raccomandiamo l'intercettazione di metodi non @ api, ma a volte sappiamo che potrebbe essere l'opzione migliore. (Lo lasciamo a discrezione dello sviluppatore.)

Ufficialmente, puoi intercettare metodi pubblici che non sono definitivi. I metodi privati ​​sicuramente non funzioneranno. Dalla memoria, l'intercettazione attualmente funziona creando una classe discendente che eredita la classe reale (il framework di iniezione di dipendenza crea istanze della classe generata quando si richiede una nuova istanza della classe reale). Quindi tutto ciò che consentirà la creazione di una sottoclasse e il metodo originale ignorato probabilmente funzionerà, ma si consigliano metodi pubblici, dandoci flessibilità per utilizzare qualche altra implementazione intelligente in futuro (che non sarebbe mai realistica essere realistica senza una buona ragione) .


5

So che questa ha già una risposta, ma è di 2 anni fa. Forse alcune cose sono cambiate nel frattempo.

Ecco cosa ho trovato finora.
Dalla documentazione ufficiale e dallo scavo nel processo di intercettazione.

Risponderò al contrario.
Cosa NON PUO ' essere intercettato in Magento 2.
Dal documento ufficiale

  • Oggetti istanziati prima dell'avvio di Magento \ Framework \ Interception (non sono sicuro di dove si trovi quel punto)
  • Metodi finali
  • Qualsiasi metodo dalle classi finali (poiché la classe intercettore generata deve estendere la classe originale)
  • Qualsiasi classe che contiene almeno un metodo pubblico finale
  • Metodi non pubblici (potrebbe funzionare con metodi protetti ma questo non è "etico" poiché esponerebbe metodi non pubblici all'esterno della classe)
  • metodi statici
  • __costruire
  • Tipi virtuali

Da scavare in giro

  • metodi in classi che non sono istanziati tramite il gestore oggetti. (Esempio \Magento\Framework\Phrase)
  • implementazione delle classi \Magento\Framework\ObjectManager\NoninterceptableInterface. (Ad esempio \Magento\Framework\App\Cache\Proxye tutti gli altri proxy generati automaticamente)
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.