Question

In Magento 2, what are the pros and cons of using a plugin vs an observer to achieve something?

I understand that observers are subscribed to events whereas plugins can jump in before and/or after a public method being called on a Magento class, but surely they're coming very close to crossing paths now?

Was it helpful?

Solution

Plugins are omnipresent since it is possible to modify/replace the behavior of any public method in the system. Customizations should be done using plugins for public methods/classes marked with @api annotation (stable public API) whenever possible. Such approach guarantees that customization will stay functional after new Magento releases. In addition to before/after plugins mentioned in the question, it is possible to create around plugins to substitute original behavior.

On the other hand, observers are legacy extension mechanism inherited from Magento 1, it is pretty limited and should be avoided if possible. However, unlike plugins, they may provide extension points inside protected/private methods.

OTHER TIPS

According to Magento technical guide (https://devdocs.magento.com/guides/v2.1/coding-standards/technical-guidelines.html#14-events): All values (including objects) passed to an event MUST NOT be modified in the event observer. Instead, plugins SHOULD BE used for modifying the input or output of a function.

For me the main difference between plugins and observers is:

  1. Plugins can modify only public methods while observers can modify private, protected as well.
  2. There is sort order for plugins but there is no sort order for observers.
  3. You can add observer only to the events that are already dispatched in Magento. Plugins are more flexible here.

The question here is which approach to be used Plugins or events & Observers pattern.

When to use ?

  • plugins and observers both can be used to run our custom script after certain Magento 2 - events or public methods are executed.

Which one to use ?

  • When we need to modify Magento core functionality (Ex: adding additional data to order collection object) then we have to use plugins. In this case we can't use Events & Observer.

  • When we want to run our customization after certain event is dispatched without disturbing Magento Core functionality then we have to choose Event & Observer pattern.

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top