Date: 30 mai 2015 (compte tenu de la nature changeante de Magento 2).
Magento 2 a introduit un concept de plugin , implémenté via un modèle d'intercepteur .
Ce qui n'est pas clair dans la documentation est - quelles classes et quels objets dans Magento sont "interceptables"? Autrement dit, vous configurez un plugin avec XML qui ressemble à ce qui suit
<config>
<type name="{ObservedType}">
<plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="true"/>
</type>
</config>
mais il n'est pas clair quelles classes sont valides en tant que ObservedType
. Cet ancien article wiki fournit des indices quand il dit
Veuillez noter que la fonction de plugin ne s'applique pas aux - Classes créées sans injection de dépendance, c'est-à-dire créées directement avec l'opérateur new, - Méthodes finales, - Classes finales
Est tout objet créé par l' injection de dépendance disponibles à intercepter? Est-ce que le ObservedType
besoin doit être le conseil de type fourni dans la __construct
méthode a, ou peut-il (devrait-il?) Être autre chose?
Essayant principalement de comprendre ce qui peut et ne peut pas être fait avec un intercepteur Magento 2 avant de commencer à les utiliser.
la source
Nous travaillons sur des annotations "@api" pour annoter les méthodes recommandées qui seront plus stables d'une version à l'autre. Si vous vous inquiétez de la mise à niveau, en plus de ce qui peut avoir un plugin défini, vous devriez également considérer ce qui devrait avoir un plugin défini. Nous ne recommandons pas l'interception de méthodes non @ api, mais nous savons parfois que cela peut être la meilleure option. (Nous laissons cela à la discrétion du développeur.)
Officiellement, vous pouvez intercepter des méthodes publiques qui ne sont pas définitives. Les méthodes privées ne fonctionneront certainement pas. De la mémoire, l'interception fonctionne actuellement en créant une classe descendante qui hérite de la classe réelle (le framework d'injection de dépendances crée des instances de la classe générée lorsque vous demandez une nouvelle instance de la classe réelle). Donc, tout ce qui permettra de créer une sous-classe et de remplacer la méthode d'origine fonctionnera probablement, mais les méthodes publiques sont recommandées, ce qui nous donne la flexibilité d'utiliser une autre implémentation intelligente à l'avenir (ce qui ne serait jamais réaliste sans bonne raison) .
la source
Je sais que cela a déjà une réponse, mais elle date d'il y a 2 ans. Peut-être que certaines choses ont changé entre-temps.
Voici ce que j'ai trouvé jusqu'à présent.
De la documentation officielle et de creuser dans le processus d'interception.
Je répondrai dans l'autre sens.
Ce qui NE PEUT PAS être intercepté dans Magento 2.
D'après le document officiel
De creuser autour
\Magento\Framework\Phrase
)\Magento\Framework\ObjectManager\NoninterceptableInterface
. (Par exemple\Magento\Framework\App\Cache\Proxy
et tous les autres proxys générés automatiquement)la source