30

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?

1
  • observer will very limited but plugin you do the changes for all public function Commented Dec 16, 2015 at 3:40

3 Answers 3

46

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.

6
  • Also take a look at answer talking about preferences vs plugins/observers: magento.stackexchange.com/a/94035/697 , may be useful. Commented Dec 16, 2015 at 17:44
  • @alex:- how to write plugin for protected function, most of case we need to override protected function in that situation how to do it ? magento.stackexchange.com/questions/91353/… Commented Dec 17, 2015 at 3:43
  • @PradeepKumar plugins can be added to public methods only. The question you mentioned has an answer, but proposed solution is blocked but known issue (plugins cannot be applied to virtual types). As a temporary workaround you may declare plugin for framework URL class and there add conditional logic based on arguments (so that plugin does something on your case only) Commented Dec 17, 2015 at 7:30
  • i jut gave one example , there is lot of function in protected in that case how to override, any way i there to override protected function Commented Dec 17, 2015 at 9:23
  • @PradeepKumar if you need to override a protected method you may need to extend the class and use preference/rewriting. Anyway, suggest you ask a question for it instead of in these comments
    – scrowler
    Commented Dec 17, 2015 at 18:02
6

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.
6
  • I can also update an order with an observer though right?
    – scrowler
    Commented May 1, 2019 at 19:04
  • @RobbieAverill yes, you can create an observer for checkout_submit_all_after event. Your observer will be triggered after order is successfully placed. Commented May 2, 2019 at 23:31
  • Does that mean that “they do not modify data” is not true in that case?
    – scrowler
    Commented May 3, 2019 at 1:35
  • 1
    Yes you are correct @RobbieAverill Both plugins and observers can both modify data. 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. Commented May 6, 2019 at 19:12
  • @transversus, Simple and clear. Thank you.
    – Ravi Soni
    Commented Feb 3, 2020 at 4:14
-2

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.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.