SlideShare a Scribd company logo
© 2018 Magento, Inc. Page | 1
Magento Technical Guidelines
Eugene Shakhsuvarov, Software Engineer @ Magento
© 2018 Magento, Inc. Page | 2
© 2018 Magento, Inc. Page | 3
Magento 2 Technical Guidelines
• Document which describes the desired technical state of Magento 2
• Hundreds of architect-hours invested into development of guidelines
• May seem too restrictive and sometimes unobvious in favor of code
readability and extensibility
• All of the new core code must follow the rules
http://devdocs.magento.com/guides/v2.2/coding-standards/technical-
guidelines/technical-guidelines.html
© 2018 Magento, Inc. Page | 4
Basic Principles
© 2018 Magento, Inc. Page | 5
Strict types
• Starting with Magento 2.3 only PHP 7.1+ is supported
• Explicit return types must be declared on functions
• Type hints for scalar arguments should be used
• Declaration of strict_types is encouraged where possible
© 2018 Magento, Inc. Page | 6
Class Design
© 2018 Magento, Inc. Page | 7
Object Manager
• Generally Object Manager should not be used as a class
dependency
• Doing so decreases ability for third parties to customize your code
© 2018 Magento, Inc. Page | 8
Don’t do this
• In this case dependency is
hard coded and can not be
replaced with a different one
• Would require more work to
modify the behavior by third
parties
© 2018 Magento, Inc. Page | 9
Do this instead
• Now logger may be changed
with a simple configuration in
di.xml
• Behavior is changed without
any additional coding
© 2018 Magento, Inc. Page | 10
There are exceptions to this rule
• Object Manager may still be used in classes which create objects
(Factories, Builders)
• May also be used in the core code to maintain backwards
compatibility
© 2018 Magento, Inc. Page | 11
Inheritance
• Inheritance should not be used. Composition should be used
instead
• Magento is moving away from the inheritance as a main code reuse
mechanism
• Inheritance enforces dependency on a specific parent class which
can not be replaced in runtime
• Overwriting logic based on inheritance requires a lot of boilerplate
code
© 2018 Magento, Inc. Page | 12
Inheritance Example
• Simple task of formatting
product price
• May be perfectly fine in
conditions, where third parties
do not need to modify the
behavior
• Requires complete
replacement of the default
renderer, instead of
customizing it
© 2018 Magento, Inc. Page | 13
Composition Example
• Price Formatter may be easily
replaced by injecting another
dependency in the constructor
• Allows precise modification of
behavior
© 2018 Magento, Inc. Page | 14
Inheritance Pros
• Inheritance may still be applicable in specific cases, for example
when class is a subtype of another class
© 2018 Magento, Inc. Page | 15
Single Responsibility
• All Classes should have only Single
Responsibility which is entirely
incapsulated
• Mixing different behaviors in one
class (e. g. classic Helper) greatly
decreases extensibility and
increases coupling in most of the
cases
• Allows for easy replacement of any
specific behavior by providing a
single point for change
© 2018 Magento, Inc. Page | 16
Constructing a Class
• Object must be ready for use after instantiation
• No additional public initialization methods are allowed
• Constructor should throw an exception when validation of an
argument has failed
© 2018 Magento, Inc. Page | 17
Constructor Dependency Injection
• All dependencies must be requested by the most generic type that is
required by the client object
• Class constructor can have only dependency assignment operations
and/or argument validation operations
• Proxies and interceptors must never be explicitly requested in
constructors
© 2018 Magento, Inc. Page | 18
Class members visibility
• All non-public properties and methods should be private
• Discourages use of inheritance
• Protected properties are much harder to remove from the class, as
some client code could be already extending it
© 2018 Magento, Inc. Page | 19
Temporal Coupling
• Temporal coupling must be avoided
• Semantic dependencies between methods is prone to errors as
client code never knows the current state of the system
• Method chaining in class design must be avoided
https://ocramius.github.io/blog/fluent-interfaces-are-evil/
© 2018 Magento, Inc. Page | 20
Object State
• Service classes, ones that provide behavior but not data, should not
have a state
• Only data objects or entities may have an observable state
• Getters should not change the state of an object
© 2018 Magento, Inc. Page | 21
Principle of least knowledge
• Class should have limited knowledge about other classes
• Object should only call methods only on its “friends”
• Do not “talk” to strangers
© 2018 Magento, Inc. Page | 22
Interception
© 2018 Magento, Inc. Page | 23
Interception best practices
• Avoid implementing a plugin when different kind of extension point is
available
• Plugins should not be used within own module
• Plugins should not be added to data objects
• Plugins must be stateless
© 2018 Magento, Inc. Page | 24
“Around” Plugins
• Should only be used when behavior of an original method is
supposed to be substituted in certain scenarios
• Performance penalty is increased compared to other types of
plugins
• Generate a lot of stack frames making it harder to debug the code
© 2018 Magento, Inc. Page | 25
Exception Handling
© 2018 Magento, Inc. Page | 26
Exception handling
• Exceptions must not be handled in the same function where they are
thrown
• Business logic (both application and domain) must not be managed
with exceptions. Conditional statements should be used instead
• All direct communications with third-party libraries must be wrapped
with a try/catch statement
© 2018 Magento, Inc. Page | 27
Exceptions Logging
• It is not allowed to absorb exceptions with no logging or/and any
workaround operation executed
• Any exception should be logged only in the catch block where it is
processed, and should not be re-thrown
© 2018 Magento, Inc. Page | 28
Application Layers
© 2018 Magento, Inc. Page | 29
Presentation Layer
• Request, Response, Session, Store Manager and Cookie objects
must be used only in the Presentation layer
• Controllers should only call appropriate services and return
ResultInterface implementation
• Controllers must be as lightweight as possible
• LocalizedException should only be thrown in the Presentation layer
(Controllers, Blocks)
© 2018 Magento, Inc. Page | 30
Service Layer
• Service layer is a contract for every specific module
• Service layer Interfaces may be used both as API and SPI
• Service Contracts should follow CQRS principle
© 2018 Magento, Inc. Page | 31
Persistence Layer
• Always separate business logic and persistence logic
• Entities must not contain persistence-related logic
• Entities may be persisted in different scopes
• Every persistence operation must be performed with one scope set
Page | 32© 2018 Magento, Inc.
Thank you!
Q & A

More Related Content

Similar to Magento Technical guidelines (20)

PDF
Chernivtsi Magento Meetup&Contribution day. Naida V.
Elogic Magento Development
 
PPTX
Valeriy Nayda - Best Practices in Magento 2. Based on Multi Source Inventory ...
Atwix
 
PPTX
Backward Compatibility Developer's Guide in Magento 2. #MM17CZ
Igor Miniailo
 
PPTX
Backwards Compatibility Developers Guide. #MM17NL
Igor Miniailo
 
PPTX
Virtues of platform development
Phillip Jackson
 
PPTX
Awesome Architectures in Magento 2.3
Riccardo Tempesta
 
PDF
Magento best practices
Alessandro Ronchi
 
PDF
Magento 2 Backend Development Essentials
BarnyShergold1
 
PPTX
Madison PHP - Getting Started with Magento 2
Mathew Beane
 
PPTX
MidwestPHP - Getting Started with Magento 2
Mathew Beane
 
PPT
Meet Magento Belarus - Magento2: What to expect and when? - Elena Leonova
Elena Leonova
 
PPT
Meet Magento Belarus - Elena Leonova
Amasty
 
PPTX
php[world] Magento101
Mathew Beane
 
PPTX
Zendcon magento101
Mathew Beane
 
PPTX
PHP Dublin Meetup - Clean Code in PHP
Paras Sood
 
PDF
Макс Екатериненко - Meet Magento Ukraine - Magento 2 Overview
Atwix
 
PPTX
Applying Code Customizations to Magento 2
Igor Miniailo
 
PPTX
Testing in Magento 2
Igor Miniailo
 
PDF
How I ended up contributing to Magento core
Alessandro Ronchi
 
PDF
Vinai Kopp - How i develop M2 modules
Meet Magento Italy
 
Chernivtsi Magento Meetup&Contribution day. Naida V.
Elogic Magento Development
 
Valeriy Nayda - Best Practices in Magento 2. Based on Multi Source Inventory ...
Atwix
 
Backward Compatibility Developer's Guide in Magento 2. #MM17CZ
Igor Miniailo
 
Backwards Compatibility Developers Guide. #MM17NL
Igor Miniailo
 
Virtues of platform development
Phillip Jackson
 
Awesome Architectures in Magento 2.3
Riccardo Tempesta
 
Magento best practices
Alessandro Ronchi
 
Magento 2 Backend Development Essentials
BarnyShergold1
 
Madison PHP - Getting Started with Magento 2
Mathew Beane
 
MidwestPHP - Getting Started with Magento 2
Mathew Beane
 
Meet Magento Belarus - Magento2: What to expect and when? - Elena Leonova
Elena Leonova
 
Meet Magento Belarus - Elena Leonova
Amasty
 
php[world] Magento101
Mathew Beane
 
Zendcon magento101
Mathew Beane
 
PHP Dublin Meetup - Clean Code in PHP
Paras Sood
 
Макс Екатериненко - Meet Magento Ukraine - Magento 2 Overview
Atwix
 
Applying Code Customizations to Magento 2
Igor Miniailo
 
Testing in Magento 2
Igor Miniailo
 
How I ended up contributing to Magento core
Alessandro Ronchi
 
Vinai Kopp - How i develop M2 modules
Meet Magento Italy
 

More from Elogic Magento Development (14)

PPTX
Миграция кода с Magento 1 на Magento 2
Elogic Magento Development
 
PPTX
Introduction to Magento Community
Elogic Magento Development
 
PDF
CQRS and Event-Sourcing in Magento2 by examples of MSI
Elogic Magento Development
 
PPTX
Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi
Elogic Magento Development
 
PPTX
The process of a Lean Magento development
Elogic Magento Development
 
PPT
12 Ways to Improve Magento 2 Security and Performance
Elogic Magento Development
 
PPTX
MMnl Pavlo Okhrem
Elogic Magento Development
 
PPTX
Payment integration patterns в Magento2
Elogic Magento Development
 
PPTX
Как благодаря композеру использовать сторонние компоненты в Magento 2
Elogic Magento Development
 
PPTX
Magento 2 - the future of eCommerce
Elogic Magento Development
 
PDF
RequireJS і Magento 2
Elogic Magento Development
 
PPT
Як перехід на Magento допоміг нам стати лідером
Elogic Magento Development
 
PDF
Как переписать модуль с Magento 1 на Magento 2
Elogic Magento Development
 
Миграция кода с Magento 1 на Magento 2
Elogic Magento Development
 
Introduction to Magento Community
Elogic Magento Development
 
CQRS and Event-Sourcing in Magento2 by examples of MSI
Elogic Magento Development
 
Chernivtsi Magento Meetup&Contribution day. V. Kublytskyi
Elogic Magento Development
 
The process of a Lean Magento development
Elogic Magento Development
 
12 Ways to Improve Magento 2 Security and Performance
Elogic Magento Development
 
MMnl Pavlo Okhrem
Elogic Magento Development
 
Payment integration patterns в Magento2
Elogic Magento Development
 
Как благодаря композеру использовать сторонние компоненты в Magento 2
Elogic Magento Development
 
Magento 2 - the future of eCommerce
Elogic Magento Development
 
RequireJS і Magento 2
Elogic Magento Development
 
Як перехід на Magento допоміг нам стати лідером
Elogic Magento Development
 
Как переписать модуль с Magento 1 на Magento 2
Elogic Magento Development
 
Ad

Recently uploaded (20)

PDF
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PDF
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PPTX
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
PPTX
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
PDF
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
PDF
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
PDF
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PDF
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
PDF
Staying Human in a Machine- Accelerated World
Catalin Jora
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
PPTX
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Transforming Utility Networks: Large-scale Data Migrations with FME
Safe Software
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
Newgen Beyond Frankenstein_Build vs Buy_Digital_version.pdf
darshakparmar
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
From Sci-Fi to Reality: Exploring AI Evolution
Svetlana Meissner
 
Webinar: Introduction to LF Energy EVerest
DanBrown980551
 
Go Concurrency Real-World Patterns, Pitfalls, and Playground Battles.pdf
Emily Achieng
 
Transcript: New from BookNet Canada for 2025: BNC BiblioShare - Tech Forum 2025
BookNet Canada
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
"Beyond English: Navigating the Challenges of Building a Ukrainian-language R...
Fwdays
 
Using FME to Develop Self-Service CAD Applications for a Major UK Police Force
Safe Software
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
POV_ Why Enterprises Need to Find Value in ZERO.pdf
darshakparmar
 
Staying Human in a Machine- Accelerated World
Catalin Jora
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
How Startups Are Growing Faster with App Developers in Australia.pdf
India App Developer
 
"Autonomy of LLM Agents: Current State and Future Prospects", Oles` Petriv
Fwdays
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
Ad

Magento Technical guidelines

  • 1. © 2018 Magento, Inc. Page | 1 Magento Technical Guidelines Eugene Shakhsuvarov, Software Engineer @ Magento
  • 2. © 2018 Magento, Inc. Page | 2
  • 3. © 2018 Magento, Inc. Page | 3 Magento 2 Technical Guidelines • Document which describes the desired technical state of Magento 2 • Hundreds of architect-hours invested into development of guidelines • May seem too restrictive and sometimes unobvious in favor of code readability and extensibility • All of the new core code must follow the rules http://devdocs.magento.com/guides/v2.2/coding-standards/technical- guidelines/technical-guidelines.html
  • 4. © 2018 Magento, Inc. Page | 4 Basic Principles
  • 5. © 2018 Magento, Inc. Page | 5 Strict types • Starting with Magento 2.3 only PHP 7.1+ is supported • Explicit return types must be declared on functions • Type hints for scalar arguments should be used • Declaration of strict_types is encouraged where possible
  • 6. © 2018 Magento, Inc. Page | 6 Class Design
  • 7. © 2018 Magento, Inc. Page | 7 Object Manager • Generally Object Manager should not be used as a class dependency • Doing so decreases ability for third parties to customize your code
  • 8. © 2018 Magento, Inc. Page | 8 Don’t do this • In this case dependency is hard coded and can not be replaced with a different one • Would require more work to modify the behavior by third parties
  • 9. © 2018 Magento, Inc. Page | 9 Do this instead • Now logger may be changed with a simple configuration in di.xml • Behavior is changed without any additional coding
  • 10. © 2018 Magento, Inc. Page | 10 There are exceptions to this rule • Object Manager may still be used in classes which create objects (Factories, Builders) • May also be used in the core code to maintain backwards compatibility
  • 11. © 2018 Magento, Inc. Page | 11 Inheritance • Inheritance should not be used. Composition should be used instead • Magento is moving away from the inheritance as a main code reuse mechanism • Inheritance enforces dependency on a specific parent class which can not be replaced in runtime • Overwriting logic based on inheritance requires a lot of boilerplate code
  • 12. © 2018 Magento, Inc. Page | 12 Inheritance Example • Simple task of formatting product price • May be perfectly fine in conditions, where third parties do not need to modify the behavior • Requires complete replacement of the default renderer, instead of customizing it
  • 13. © 2018 Magento, Inc. Page | 13 Composition Example • Price Formatter may be easily replaced by injecting another dependency in the constructor • Allows precise modification of behavior
  • 14. © 2018 Magento, Inc. Page | 14 Inheritance Pros • Inheritance may still be applicable in specific cases, for example when class is a subtype of another class
  • 15. © 2018 Magento, Inc. Page | 15 Single Responsibility • All Classes should have only Single Responsibility which is entirely incapsulated • Mixing different behaviors in one class (e. g. classic Helper) greatly decreases extensibility and increases coupling in most of the cases • Allows for easy replacement of any specific behavior by providing a single point for change
  • 16. © 2018 Magento, Inc. Page | 16 Constructing a Class • Object must be ready for use after instantiation • No additional public initialization methods are allowed • Constructor should throw an exception when validation of an argument has failed
  • 17. © 2018 Magento, Inc. Page | 17 Constructor Dependency Injection • All dependencies must be requested by the most generic type that is required by the client object • Class constructor can have only dependency assignment operations and/or argument validation operations • Proxies and interceptors must never be explicitly requested in constructors
  • 18. © 2018 Magento, Inc. Page | 18 Class members visibility • All non-public properties and methods should be private • Discourages use of inheritance • Protected properties are much harder to remove from the class, as some client code could be already extending it
  • 19. © 2018 Magento, Inc. Page | 19 Temporal Coupling • Temporal coupling must be avoided • Semantic dependencies between methods is prone to errors as client code never knows the current state of the system • Method chaining in class design must be avoided https://ocramius.github.io/blog/fluent-interfaces-are-evil/
  • 20. © 2018 Magento, Inc. Page | 20 Object State • Service classes, ones that provide behavior but not data, should not have a state • Only data objects or entities may have an observable state • Getters should not change the state of an object
  • 21. © 2018 Magento, Inc. Page | 21 Principle of least knowledge • Class should have limited knowledge about other classes • Object should only call methods only on its “friends” • Do not “talk” to strangers
  • 22. © 2018 Magento, Inc. Page | 22 Interception
  • 23. © 2018 Magento, Inc. Page | 23 Interception best practices • Avoid implementing a plugin when different kind of extension point is available • Plugins should not be used within own module • Plugins should not be added to data objects • Plugins must be stateless
  • 24. © 2018 Magento, Inc. Page | 24 “Around” Plugins • Should only be used when behavior of an original method is supposed to be substituted in certain scenarios • Performance penalty is increased compared to other types of plugins • Generate a lot of stack frames making it harder to debug the code
  • 25. © 2018 Magento, Inc. Page | 25 Exception Handling
  • 26. © 2018 Magento, Inc. Page | 26 Exception handling • Exceptions must not be handled in the same function where they are thrown • Business logic (both application and domain) must not be managed with exceptions. Conditional statements should be used instead • All direct communications with third-party libraries must be wrapped with a try/catch statement
  • 27. © 2018 Magento, Inc. Page | 27 Exceptions Logging • It is not allowed to absorb exceptions with no logging or/and any workaround operation executed • Any exception should be logged only in the catch block where it is processed, and should not be re-thrown
  • 28. © 2018 Magento, Inc. Page | 28 Application Layers
  • 29. © 2018 Magento, Inc. Page | 29 Presentation Layer • Request, Response, Session, Store Manager and Cookie objects must be used only in the Presentation layer • Controllers should only call appropriate services and return ResultInterface implementation • Controllers must be as lightweight as possible • LocalizedException should only be thrown in the Presentation layer (Controllers, Blocks)
  • 30. © 2018 Magento, Inc. Page | 30 Service Layer • Service layer is a contract for every specific module • Service layer Interfaces may be used both as API and SPI • Service Contracts should follow CQRS principle
  • 31. © 2018 Magento, Inc. Page | 31 Persistence Layer • Always separate business logic and persistence logic • Entities must not contain persistence-related logic • Entities may be persisted in different scopes • Every persistence operation must be performed with one scope set
  • 32. Page | 32© 2018 Magento, Inc. Thank you! Q & A