Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
Key Insights into
Development Design
Patterns for Magento 2
CTO @ GiftsDirect, TheIrishStore
Max Pronko
Today’s Presentation Includes
• Design Patterns and Magento 2
• Aspect Oriented Programming
• Questions and Answers
Design Patterns
What is Design Pattern?
describes a problem which occurs over and over again,
and then describes the core of the solution ...
Composite pattern is used to treat a group of objects in
similar way as a single object uniformly
Composite Pattern
Composite Diagram
BuilderInterface
Common
implements
AddressCreditCard Composite
1
*
MagentoPaymentGateway
BuilderComposite Example
class BuilderComposite implements BuilderInterface
{
/** @var BuilderInterface[] */
private $buil...
CompositeBuilder Declaration
<config>
<virtualType name="CaptureBuilderComposite" type="MagentoPaymentGatewayRequestBuilde...
Strategy lets the algorithm vary independently from the
clients that use it
Strategy Pattern
Strategy Pattern Diagram
BuilderInterface
CaptureBuilder
implements
PartialBuilder
CaptureStrategy
GatewayCommand
implemen...
Strategy Pattern
class CaptureStrategy implements BuilderInterface {
/** @var BuilderInterface */
protected $partial;
/** ...
Define an interface for creating an object, but let
subclasses decide which class to instantiate. Factory
Method lets a cl...
Factory Method Pattern Diagram
TransferFactory
implements
TransferFactoryInterfaceGatewayCommand
uses
create()
MagentoPaym...
Transfer Factory Example
namespace MagentoBraintreeGatewayHttp;
class TransferFactory implements TransferFactoryInterface
...
Transfer Factory Example
namespace MagentoBraintreeGatewayHttp;
class TransferFactory implements TransferFactoryInterface
...
Define a one-to-many dependency between objects so
that when one object changes state, all its dependents
are notified and...
Observer Pattern Diagram
Manager Config
implements
ObserverInterface
ManagerInterfaceAdapter
dispatch()
getObservers()
exe...
Dispatching an event
use MagentoFrameworkEventManagerInterface;
class Adapter implements MethodInterface {
/** @var Manage...
Observer Configuration
<config>
<event name=“payment_method_assign_data_custom">
<observer name="custom_gateway_data_assig...
Observer Implementation
namespace PronkoPaymentObserver;
use MagentoFrameworkEventObserver;
use MagentoPaymentObserverAbst...
Typical implementation of Dependency Manager. Enables
Inversion of Control support for Magento 2
Object Manager
Object Manager
• Dependency Manager
• Instantiates classes
• Creates objects
• Provides shared objects pool
• Supports laz...
Object Manager Implementation
Singleton
Builder
Abstract Factory
Factory Method
Decorator
Value Object
Composite
Strategy
...
Object Manager Diagram
ObjectManagerInterface
ObjectManager
App/ObjectManager
ObjectManagerFactory App/Bootstrap
[Object]
...
Object Manager Usage
Good
• Factory
• Builder
• Proxy
• Application
• generated classes
Bad
• Data Objects
• Business Obje...
Attach additional responsibilities to an object dynamically.
Decorators provide a flexible alternative to subclassing for
...
Decorator Pattern Diagram
FactoryInterface
DynamicProduction
implements
AbstractFactory
DynamicDeveloper
ProfilerFactoryDe...
namespace MagentoFrameworkAppObjectManagerEnvironment;
abstract class AbstractEnvironment implements EnvironmentInterface ...
namespace MagentoFrameworkAppObjectManagerEnvironment;
abstract class AbstractEnvironment implements EnvironmentInterface ...
A proxy is a class functioning as an interface to something
else. It is used for resource consuming objects
Proxy Pattern
Proxy Pattern Diagram
NoninterceptableInterface
AreaList/Proxy
MagentoFrameworkApp
AreaList
implements
extends
Proxy Pattern Declaration
<config>
<type name="MagentoFrameworkConfigScope">
<arguments>
<argument name="areaList" xsi:typ...
Aspect Oriented Programming
a programming paradigm that aims to increase modularity
by allowing the separation of cross-cutting concerns. The
goal is ...
AOP Cross Cutting Concerns
Security
Logging
Monitoring
Catalog Sales
Checkout …
Magento AOP Example
Client
PluginPlugin Target
Interceptor
Plugin
Invoke Method
Result
Interception Pipeline
ObjectManager...
Types of a Plugin
Method
Before After
Around
Affects input
method argument
Modifies behaviour
Affects method
return value
Check Module Status Plugin
After
Around
namespace MagentoFrameworkModulePlugin;
class DbStatusValidator
{
public function ...
Invalidate Cache Plugin
After
Around
namespace MagentoWebapiSecurityModelPlugin;
class CacheInvalidator
{
public function ...
Password Security Check Plugin
After
Around
namespace MagentoSecurityModelPlugin;
class AccountManagement
{
public functio...
Declaring Plugin
After
File: MagentoSecurityetcdi.xml
<config>
<type name="MagentoCustomerModelAccountManagement">
<plugin...
Interception
Limitations
• Final methods / classes
• Static class and __construct() methods
• Virtual types
Benefits
• Pub...
Summary
• Solve problems using Design Patterns
• Don’t overuse Design Patterns
• Build your code on abstractions (interfac...
Ask Me Anything
Thank you
www.maxpronko.com
max_pronko
Key Insights into Development Design Patterns for Magento 2 - Magento Live UK
Upcoming SlideShare
Loading in …5
×

Key Insights into Development Design Patterns for Magento 2 - Magento Live UK

8,542 views

Published on

I have had a chance to speak at Magento Live UK 2016 with topic "Key Insights into Development Design Patterns for Magento 2". Feel free to share, comment, provide feedback.

In the deck i highlight Development Design Patterns used in Magento 2. I also speak about Aspect Oriented Programming and how it affected Magento 2 implementation.

More about Magento 2 read at my blog: https://www.maxpronko.com/

Published in: Technology
  • Be the first to comment

Key Insights into Development Design Patterns for Magento 2 - Magento Live UK

  1. 1. Key Insights into Development Design Patterns for Magento 2
  2. 2. CTO @ GiftsDirect, TheIrishStore Max Pronko
  3. 3. Today’s Presentation Includes • Design Patterns and Magento 2 • Aspect Oriented Programming • Questions and Answers
  4. 4. Design Patterns
  5. 5. What is Design Pattern? describes a problem which occurs over and over again, and then describes the core of the solution to that problem, without ever doing it the same way twice “ - Christopher Alexander
  6. 6. Composite pattern is used to treat a group of objects in similar way as a single object uniformly Composite Pattern
  7. 7. Composite Diagram BuilderInterface Common implements AddressCreditCard Composite 1 * MagentoPaymentGateway
  8. 8. BuilderComposite Example class BuilderComposite implements BuilderInterface { /** @var BuilderInterface[] */ private $builders; public function __construct($builders) { $this->builders = $builders; } public function build(array $buildSubject) { $result = []; foreach ($this->builders as $builder) { $result = array_merge_recursive($result, $builder->build($buildSubject)); } return $result; } }
  9. 9. CompositeBuilder Declaration <config> <virtualType name="CaptureBuilderComposite" type="MagentoPaymentGatewayRequestBuilderComposite"> <arguments> <argument name="builders" xsi:type="array"> <item name="common" xsi:type="object">PronkoPaymentGatewayCommonBuilder</item> <item name=“credit_card" xsi:type="object">PronkoPaymentGatewayCreditCardBuilder</item> <item name="address" xsi:type="object">PronkoPaymentGatewayAddressBuilder</item> </argument> </arguments> </virtualType> </config> File: PronkoPaymentetcdi.xml
  10. 10. Strategy lets the algorithm vary independently from the clients that use it Strategy Pattern
  11. 11. Strategy Pattern Diagram BuilderInterface CaptureBuilder implements PartialBuilder CaptureStrategy GatewayCommand implements calls uses MagentoPaymentGateway
  12. 12. Strategy Pattern class CaptureStrategy implements BuilderInterface { /** @var BuilderInterface */ protected $partial; /** @var BuilderInterface */ protected $capture; public function build(array $buildSubject) { $condition = //set condition if ($condition) { return $this->partial->build($buildSubject); } return $this->capture->build($buildSubject); } }
  13. 13. Define an interface for creating an object, but let subclasses decide which class to instantiate. Factory Method lets a class defer instantiation to subclasses Factory Method Pattern
  14. 14. Factory Method Pattern Diagram TransferFactory implements TransferFactoryInterfaceGatewayCommand uses create() MagentoPaymentGatewayCommand Transfer creates
  15. 15. Transfer Factory Example namespace MagentoBraintreeGatewayHttp; class TransferFactory implements TransferFactoryInterface { private $transferBuilder; public function __construct(TransferBuilder $transferBuilder) { $this->transferBuilder = $transferBuilder; } public function create(array $request) { return $this->transferBuilder ->setBody($request) ->build(); } }
  16. 16. Transfer Factory Example namespace MagentoBraintreeGatewayHttp; class TransferFactory implements TransferFactoryInterface { private $transferBuilder; public function __construct(TransferBuilder $transferBuilder) { $this->transferBuilder = $transferBuilder; } public function create(array $request) { return $this->transferBuilder ->setBody($request) ->build(); } } class GatewayCommand implements CommandInterface { public function execute(array $commandSubject) { $transferO = $this->transferFactory->create( $this->requestBuilder->build($commandSubject) ); $response = $this->client->placeRequest($transferO) // … code } }
  17. 17. Define a one-to-many dependency between objects so that when one object changes state, all its dependents are notified and updated automatically Observer Pattern
  18. 18. Observer Pattern Diagram Manager Config implements ObserverInterface ManagerInterfaceAdapter dispatch() getObservers() execute() events.xml PaymentObserver implements MagentoPayment
  19. 19. Dispatching an event use MagentoFrameworkEventManagerInterface; class Adapter implements MethodInterface { /** @var ManagerInterface */ protected $eventManager; public function assignData(MagentoFrameworkDataObject $data) { $this->eventManager->dispatch( 'payment_method_assign_data_' . $this->getCode(), [ AbstractDataAssignObserver::METHOD_CODE => $this, AbstractDataAssignObserver::MODEL_CODE => $this->getInfoInstance(), AbstractDataAssignObserver::DATA_CODE => $data ] ); return $this; } }
  20. 20. Observer Configuration <config> <event name=“payment_method_assign_data_custom"> <observer name="custom_gateway_data_assign" instance="PronkoPaymentObserverDataAssignObserver" /> </event> </config> File: PronkoPaymentetcevents.xml
  21. 21. Observer Implementation namespace PronkoPaymentObserver; use MagentoFrameworkEventObserver; use MagentoPaymentObserverAbstractDataAssignObserver; class DataAssignObserver extends AbstractDataAssignObserver { public function execute(Observer $observer) { $data = $this->readDataArgument($observer); $additionalData = $data->getData(PaymentInterface::KEY_ADDITIONAL_DATA); $payment = $observer->getPaymentModel(); $payment->setCcLast4(substr($additionalData->getData('cc_number'), -4)); } }
  22. 22. Typical implementation of Dependency Manager. Enables Inversion of Control support for Magento 2 Object Manager
  23. 23. Object Manager • Dependency Manager • Instantiates classes • Creates objects • Provides shared objects pool • Supports lazy Initialisation • __construct() method injection
  24. 24. Object Manager Implementation Singleton Builder Abstract Factory Factory Method Decorator Value Object Composite Strategy CQRS Dependency Injection …
  25. 25. Object Manager Diagram ObjectManagerInterface ObjectManager App/ObjectManager ObjectManagerFactory App/Bootstrap [Object] uses creates configures uses [Object] [Object] MagentoFrameworkObjectManager
  26. 26. Object Manager Usage Good • Factory • Builder • Proxy • Application • generated classes Bad • Data Objects • Business Objects • Action Controllers • Mage::getModel like calls • Blocks
  27. 27. Attach additional responsibilities to an object dynamically. Decorators provide a flexible alternative to subclassing for extending functionality Decorator Pattern
  28. 28. Decorator Pattern Diagram FactoryInterface DynamicProduction implements AbstractFactory DynamicDeveloper ProfilerFactoryDecorator 1 1 MagentoFrameworkObjectManager Compiled extends
  29. 29. namespace MagentoFrameworkAppObjectManagerEnvironment; abstract class AbstractEnvironment implements EnvironmentInterface { protected function decorate($arguments){ if (isset($arguments['MAGE_PROFILER']) && $arguments['MAGE_PROFILER'] == 2) { $this->factory = new FactoryDecorator( $this->factory, Log::getInstance() ); } } } Decorator: Profiler Factory
  30. 30. namespace MagentoFrameworkAppObjectManagerEnvironment; abstract class AbstractEnvironment implements EnvironmentInterface { protected function decorate($arguments){ if (isset($arguments['MAGE_PROFILER']) && $arguments['MAGE_PROFILER'] == 2) { $this->factory = new FactoryDecorator( $this->factory, Log::getInstance() ); } } } Decorator: Profiler Factory class DecoratorFactory implements FactoryInterface {} class CompiledFactory implements FactoryInterface {}
  31. 31. A proxy is a class functioning as an interface to something else. It is used for resource consuming objects Proxy Pattern
  32. 32. Proxy Pattern Diagram NoninterceptableInterface AreaList/Proxy MagentoFrameworkApp AreaList implements extends
  33. 33. Proxy Pattern Declaration <config> <type name="MagentoFrameworkConfigScope"> <arguments> <argument name="areaList" xsi:type="object">MagentoFrameworkAppAreaListProxy</argument> </arguments> </type> </config> File: app/etc/di.xml
  34. 34. Aspect Oriented Programming
  35. 35. a programming paradigm that aims to increase modularity by allowing the separation of cross-cutting concerns. The goal is to achieve loose coupling Aspect Oriented Programming
  36. 36. AOP Cross Cutting Concerns Security Logging Monitoring Catalog Sales Checkout …
  37. 37. Magento AOP Example Client PluginPlugin Target Interceptor Plugin Invoke Method Result Interception Pipeline ObjectManager Result Invoke get Result
  38. 38. Types of a Plugin Method Before After Around Affects input method argument Modifies behaviour Affects method return value
  39. 39. Check Module Status Plugin After Around namespace MagentoFrameworkModulePlugin; class DbStatusValidator { public function aroundDispatch( MagentoFrameworkAppFrontController $subject, Closure $proceed, MagentoFrameworkAppRequestInterface $request ) { if (!$this->cache->load('db_is_up_to_date')) { $errors = $this->dbVersionInfo->getDbVersionErrors(); if ($errors) { // throw exception } else { $this->cache->save('true', 'db_is_up_to_date'); } } return $proceed($request); } }
  40. 40. Invalidate Cache Plugin After Around namespace MagentoWebapiSecurityModelPlugin; class CacheInvalidator { public function afterAfterSave( MagentoFrameworkAppConfigValue $subject, MagentoFrameworkAppConfigValue $result ) { if (condition) { $this->cacheTypeList->invalidate(MagentoWebapiModelCacheTypeWebapi::TYPE_IDENTIFIER); } return $result; } }
  41. 41. Password Security Check Plugin After Around namespace MagentoSecurityModelPlugin; class AccountManagement { public function beforeInitiatePasswordReset( AccountManagementOriginal $accountManagement, $email, $template, $websiteId = null ) { $this->securityManager->performSecurityCheck( PasswordResetRequestEvent::CUSTOMER_PASSWORD_RESET_REQUEST, $email ); return [$email, $template, $websiteId]; } }
  42. 42. Declaring Plugin After File: MagentoSecurityetcdi.xml <config> <type name="MagentoCustomerModelAccountManagement"> <plugin name="security_check_customer_password_reset_attempt" type="MagentoSecurityModelPluginAccountManag </type> </config>
  43. 43. Interception Limitations • Final methods / classes • Static class and __construct() methods • Virtual types Benefits • Public methods • Auto-generated Decorators • Flexible approach • NoninterceptableInterface
  44. 44. Summary • Solve problems using Design Patterns • Don’t overuse Design Patterns • Build your code on abstractions (interfaces) • Look inside Magento 2 for good practices
  45. 45. Ask Me Anything Thank you www.maxpronko.com max_pronko

×