Domanda

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

Magento 2 ha introdotto un plugin concetto, implementato tramite un modello interceptor.

Cosa non è chiaro dai documenti -- che le classi e gli oggetti in Magento sono "intercettare"in grado?Che è, si può configurare un plugin XML che appare come il seguente

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

ma non è chiaro quali classi sono validi come ObservedType.Questo precedente articolo wiki fornisce alcuni indizi, quando dice

Si prega di notare che la caratteristica plug-in non si applica a - Classi creato senza l'iniezione di dipendenza, che è, creata con il nuovo operatore direttamente, Finale metodi di Finale classi

È qualsiasi oggetto creato tramite l'iniezione di dipendenza disponibile per essere intercettati?Il ObservedType bisogno di essere il tipo di suggerimento fornito in una __construct metodo, o può (deve?) essere qualcos'altro?

Soprattutto cercando di ottenere la mia testa intorno a quello che può e non può essere fatto con un Magento 2 interceptor prima di iniziare ad usarli.

È stato utile?

Soluzione

Ogni classe di un modulo magento è intercaptabile.

Come descritto sull'attuale wiki, è limitato da metodi e classi finali

Non convalidato, ma le classi di librerie (LIB Directory) sono (/ dovrebbero) non consentite di intercettare.

La limitazione come è stato creato l'oggetto non è più vero che penso, almeno se il caricatore automatico è configurato correttamente.E non dovrebbe importare come non vengono creati al volo, ma quando il generatore è stato eseguito.(Quindi è solo una questione di, il Autoloader Magento dovrebbe essere il primo)

Altri suggerimenti

Stiamo lavorando sulla "@api" annotazioni annotazioni raccomandato metodi che sarà più stabile in tutte le release.Se ti preoccupi di migliorabilità, in aggiunta a quello che può un plugin definiti, si dovrebbe anche prendere in considerazione ciò che dovrebbe un plugin definito.Non consigliamo l'intercettazione di non-@metodi api, ma a volte sappiamo che può essere l'opzione migliore.(Lasciamo che lo sviluppatore discrezione.)

Ufficialmente, è in grado di intercettare i metodi pubblici che non sono definitivi.Metodi privati sicuramente non funzionerà.Dalla memoria, le intercettazioni, attualmente lavora con la creazione di un discendente di classe che eredita la vera classe (il quadro di iniezione di dipendenza crea istanze della classe generata quando si chiede una nuova istanza della classe reale).Quindi tutto ciò che permetterà una sotto-classe e il metodo originale overrided probabilmente funzionerà, ma di metodi pubblici sono raccomandato, ci dà la flessibilità di utilizzare alcuni altri implementazione intelligente in futuro (che non sarebbe mai accadere di essere realistico, senza una buona ragione).

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

Ecco cosa ho trovato finora.
Dal Documentazione ufficiale e da scavare nel Processo di intercettazione.

Risponderò al contrario.
Che non può essere intercettato in Magento 2.
Dal documento ufficiale

    .
  • Gli oggetti che vengono istanziati prima del magento \ framework \ intercettazione è bootstrappato (non sicuro dove è quel punto)
  • Metodi finali
  • Qualsiasi metodo delle classi finali (perché la classe interceptor generata deve estendere la classe originale)
  • Qualsiasi classe che contiene almeno un metodo pubblico finale
  • Metodi non pubblici (potrebbe funzionare per metodi protetti, ma questo non è "etico" poiché esporrebbe metodi non pubblici verso l'esterno della classe)
  • Metodi statici
  • __ Costruisci
  • Tipi virtuali

da scavare intorno

    .
  • Metodi in classi che non sono istanziati tramite Object Manager. (ESEMPIO \Magento\Framework\Phrase)
  • Lezioni di implementazione \Magento\Framework\ObjectManager\NoninterceptableInterface. (Ad esempio \Magento\Framework\App\Cache\Proxy e tutti gli altri proxy autogenerati)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a magento.stackexchange
scroll top