26

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?

  • observer will very limited but plugin you do the changes for all public function – Pradeep Kumar Dec 16 '15 at 3:40
39

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.

  • Also take a look at answer talking about preferences vs plugins/observers: magento.stackexchange.com/a/94035/697 , may be useful. – Alex Paliarush Dec 16 '15 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/… – Pradeep Kumar Dec 17 '15 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) – Alex Paliarush Dec 17 '15 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 – Pradeep Kumar Dec 17 '15 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 – Robbie Averill Dec 17 '15 at 18:02
0

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.
  • I can also update an order with an observer though right? – Robbie Averill May 1 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. – transversus May 2 at 23:31
  • Does that mean that “they do not modify data” is not true in that case? – Robbie Averill May 3 at 1:35
  • 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. – transversus May 6 at 19:12

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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