SlideShare a Scribd company logo
Fundamentals of Extending Magento 2
Presented by: David Alger
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
My Experience
Magento developer since early 2009
Magento 1 & 2 contributor
GitHub Community Moderator
Director of Technology at Classy Llama
2
@blackbooker / #phpworldFundamentals of Extending Magento 2
Platform Architecture
Some highlights
3
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Technology Stack
PHP 5.6.x or 5.5.x*
PSR-0 through PSR-4
HTML5 & CSS3 w/LESS
JQuery w/RequireJS
3PLs ZF1, ZF2 and Symfony
Apache 2.2, 2.4 / Nginx 1.8
MySQL 5.6
Composer meta-packages
*There are known issues with 5.5.10–5.5.16 and 5.6.0
Optional components:
• Varnish as a cache layer
• Redis for sessions or page caching
• Solr (search engine)
4
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Backwards Compatibility
SemVer 2.0 policy for PHP code
Version numbers in MAJOR.MINOR.PATCH format
• MAJOR indicates incompatible API changes
• MINOR where added functionality is backward-compatible
• PATCH for backward-compatible bug fixes
Guaranteed BC for code with @api annotations
@deprecated annotations with ~1yr later removal
5
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Strongly Layered
Presentation layer to provide view components
Service layer defined interfaces for integrating with logic
Domain layer to provide core business logic and base functionality
Persistence layer using an active record pattern to store data
6
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Magento Components
Modules support major functionality and behavior
Themes implement the interface users interact with
Language packs to support i18n
Vendor libraries such as ZF1, ZF1 & Symfony
7
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Breaking it Down
MagentoFramework
• provides common libraries such as FS, Events, OM, etc
• core application behavior such as routing
• does not "know" about anything outside of itself
VendorLibrary similar to framework, don't re-invent
Modules,Themes & Language Packs
• areas you as a developer will be working with
• may fall into either of 2 categories: required or optional
8
@blackbooker / #phpworldFundamentals of Extending Magento 2
Digging In
Devil in the details
9
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Dependency Injection
Implements the constructor injection pattern
Dependencies may be provided automatically
Some injected dependencies must be set in XML
This completely replaces the "Mage" god class in 1.x
Class dependencies can be replaced via module config
10
@blackbooker / #phpworldFundamentals of Extending Magento 2
Injecting an Interface
class Norf
{
protected $bar;
public function __construct(BarInterface $bar) {
$this->bar = $bar;
parent::__construct();
}
}
11
@blackbooker / #phpworldFundamentals of Extending Magento 2
Preferred Implementation
<?xml version="1.0"?>
<config xmlns:xsi="..." xsi:noNamespaceSchemaLocation="...">
<preference for="BarInterface" type="Bar" />
</config
12
etc/di.xml
@blackbooker / #phpworldFundamentals of Extending Magento 2
DI Proxies
<type name="FooBarModelBaz" shared="false">
<arguments>
<argument name="norf" xsi:type="object">FooBarModelNorf</argument>
</arguments>
</type>
13
@blackbooker / #phpworldFundamentals of Extending Magento 2
Plugins
Plugins work using technique called interception
They are implemented in context of a module
You write your plugins; interceptor code is generated
Can wrap around, be called before/after class methods
14
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html
@blackbooker / #phpworldFundamentals of Extending Magento 2
Declaring the Plugin
<?xml version="1.0"?>
<config xmlns:xsi="..." xsi:noNamespaceSchemaLocation="...">
<type name="FooBarModelNorf">
<plugin name="Foo_Bar::Qux" type="FooBarPluginQux"/>
</type>
</config>
15
etc/di.xml
@blackbooker / #phpworldFundamentals of Extending Magento 2
Intercepting Before
class Qux
{
public function beforeSetBaz(Norf $subject, $baz)
{
// modify baz
return [$baz];
}
}
16
Plugin/Qux.php
@blackbooker / #phpworldFundamentals of Extending Magento 2
Intercepting After
class Qux
{
public function afterGetBaz(Norf $subject, $result)
{
// modify result
return $result;
}
}
17
Plugin/Qux.php
@blackbooker / #phpworldFundamentals of Extending Magento 2
Wrapping Around
class Qux
{
public function aroundBaztastic(Norf $subject, Closure $proceed)
{
// do something before
$result = $proceed();
if ($result) {
// do something really cool
}
return $result;
}
}
18
Plugin/Qux.php
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Where can you Plugin?
Anywhere except for…
• final methods / classes
• non-public methods
• class methods
• __construct
19
http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Code Generation
Auto-generates code to create non-existent classes
This is based on convention such as *Factory classes
You can still see and debug the code in var/generation
In development mode these are created in autoloader
Production mode expects pre-compilation via CLI tool
20
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Factory Pattern
Single purpose objects used to create object instances
Isolate the object manager from business logic
Instead of injecting ObjectManager, use a *Factory
Uniform pattern interface since they are generated
21
@blackbooker / #phpworldFundamentals of Extending Magento 2
BaseFactory
class BaseFactory
{
protected $objectManager;
public function __construct(ObjectManager $objectManager)
{
$this->objectManager = $objectManager;
}
public function create($sourceData = null)
{
return $this->objectManager->create('Base', ['sourceData' => $sourceData]);
}
}
22
@blackbooker / #phpworldFundamentals of Extending Magento 2
Using a Factory
class Norf
{
protected $barFactory;
public function __construct(BarFactory $barFactory) {
$this->barFactory = $barFactory;
parent::__construct();
}
/** returns Bar object instantiated by object manager */
public function createBar() {
return $this->barFactory->create();
}
}
23
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Component Management
All components installed via composer
Register component so Magento knows it's there
Composer auto-loader used to load registration.php
Any app/code/*/*/registration.php loaded in bootstrap
24
@blackbooker / #phpworldFundamentals of Extending Magento 2
Component Registration
use MagentoFrameworkComponentComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Foo_Bar', __DIR__);
25
registration.php
@blackbooker / #phpworldFundamentals of Extending Magento 2
Autoload Configuration
{
"name": "foo/bar-component",
"autoload": {
"psr-4": { "FooBarComponent": "" },
"files": [ "registration.php" ]
}
}
26
composer.json
@blackbooker / #phpworldFundamentals of Extending Magento 2
Component registration
for everything!
27
@blackbooker / #phpworldFundamentals of Extending Magento 2
Installing Magento 2
Starting your first project
28
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Which install method?
Getting the source
• Complete tarball
• Composer meta-packages
• GitHub clone
App installation
• Command line `bin/magento` tool
• GUI wizard
29
http://devdocs.magento.com/guides/v2.0/install-gde/continue.html
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Installing from GitHub
Used to contribute back to core via PRs
Sample data may still be installed, but messier
30
@blackbooker / #phpworldFundamentals of Extending Magento 2
Installing from GitHub
$ mkdir -p /server/sites/m2.dev
$ cd /server/sites/m2.dev
$ git clone /server/.shared/m2.repo ./ && git checkout 2.0.0
$ composer install --no-interaction --prefer-dist
$ mysql -e 'create database m2_dev'
$ bin/magento setup:install --base-url=http://m2.dev --backend-frontname=backend 
--admin-user=admin --admin-firstname=Admin --admin-lastname=Admin 
--admin-email=user@example.com --admin-password=A123456 
--db-host=dev-db --db-user=root --db-name=m2_dev
$ mkdir -p /server/sites/m2.dev/var/.m2-data && pushd /server/sites/m2.dev/var/.m2-data
$ git clone -q /server/.shared/m2-data.repo ./ && git checkout 2.0.0 && popd
$ php -f /server/sites/m2.dev/var/.m2-data/dev/tools/build-sample-data.php -- 
--ce-source=/server/sites/m2.dev
$ bin/magento setup:upgrade
$ bin/magento cache:flush
31
bit.ly/1NFrVep
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Installing via Composer
Use of meta-packages provide you more control
Clear separation between custom / vendor code
Sample data is a snap to install
Best method to use for site builds and other projects
32
@blackbooker / #phpworldFundamentals of Extending Magento 2
Installing via Composer
$ cd /sites
$ composer create-project --repository-url=https://repo.magento.com/ 
magento/project-community-edition m2.demo
$ cd m2.demo
$ chmod +x bin/magento
$ bin/magento sampledata:deploy
$ composer update # this line here because bugs... fix on it's way
$ mysql -e 'create database m2_demo'
$ bin/magento setup:install --base-url=http://m2.demo --backend-frontname=backend 
--admin-user=admin --admin-firstname=Admin --admin-lastname=Admin 
--admin-email=user@example.com --admin-password=A123456 
--db-host=dev-db --db-user=root --db-name=m2_demo
33
bit.ly/1H8P249
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Installing for Shared Hosting
Tarballs for "easy" install method on shared hosting
Essentially same code produced via composer install
Can be readily used where CLI access is not to be had
After install can be maintained with composer
34
@blackbooker / #phpworldFundamentals of Extending Magento 2
GUI Wizard vs CLI Install
is your choice
35
@blackbooker / #phpworldFundamentals of Extending Magento 236
@blackbooker / #phpworldFundamentals of Extending Magento 2
Makings of a Module
Starting with a skeleton
37
@blackbooker / #phpworldFundamentals of Extending Magento 2
Module Organization
38
@blackbooker / #phpworldFundamentals of Extending Magento 2
Skeleton
app/code/Alger
└── Skeleton
├── composer.json
├── etc
│   └── module.xml
└── registration.php
39
https://github.com/davidalger/phpworld-talk2 — initial commit
@blackbooker / #phpworldFundamentals of Extending Magento 2
registration.php
use MagentoFrameworkComponentComponentRegistrar;
ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Alger_Skeleton', __DIR__);
40
https://github.com/davidalger/phpworld-talk2
@blackbooker / #phpworldFundamentals of Extending Magento 2
module.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Alger_Skeleton" setup_version="1.0.0" />
</config>
41
https://github.com/davidalger/phpworld-talk2
@blackbooker / #phpworldFundamentals of Extending Magento 2
composer.json
{
"name": "alger/module-skeleton",
"type": "magento2-module",
"require": {
"magento/framework": "*"
},
"autoload": {
"files": [ "registration.php" ],
"psr-4": {
"AlgerSkeleton": ""
}
}
}
42
https://github.com/davidalger/phpworld-talk2
@blackbooker / #phpworldFundamentals of Extending Magento 2
Installing from GitHub
$ composer config repositories.alger/phpworld-talk2 
vcs git@github.com:davidalger/phpworld-talk2.git
$ composer require alger/module-skeleton:dev-master
$ bin/magento setup:upgrade -q && bin/magento cache:flush -q
$ git clone git@github.com:davidalger/phpworld-talk2.git 
app/code/Alger/Skeleton
$ bin/magento module:enable Alger_Skeleton
$ bin/magento setup:upgrade -q && bin/magento cache:flush -q
43
bit.ly/1MWbb1E
OR
@blackbooker / #phpworldFundamentals of Extending Magento 2
Example Block
namespace AlgerSkeletonBlock;
use AlgerSkeletonHelperBar;
use MagentoFrameworkViewElementTemplate;
use MagentoFrameworkViewElementTemplateContext;
class Norf extends Template {
protected $bar;
public function __construct(Bar $bar, Context $context, array $data = []) {
$this->bar = $bar;
parent::__construct($context, $data);
}
public function getDrinksCallout() {
return 'Helper your self to an ' . implode(' or a ', $this->bar->getDrinks()) . '!';
}
}
44
Block/Norf.php
@blackbooker / #phpworldFundamentals of Extending Magento 2
Using the Block
<?xml version="1.0"?>
<page xmlns:xsi="..." xsi:noNamespaceSchemaLocation="...">
<body>
<referenceContainer name="page.top">
<block class="AlgerSkeletonBlockNorf"
template="Alger_Skeleton::banner.phtml"/>
</referenceContainer>
</body>
</page>
45
https://github.com/davidalger/phpworld-talk2
@blackbooker / #phpworldFundamentals of Extending Magento 2
Unit Testing
namespace AlgerSkeletonTestUnit;
use MagentoFrameworkTestFrameworkUnitHelperObjectManager;
class HelperTest extends PHPUnit_Framework_TestCase {
protected $object;
protected function setUp() {
$this->object = (new ObjectManager($this))->getObject('AlgerSkeletonHelperBar');
}
/** @dataProvider pourDrinkDataProvider */
public function testPourDrink($brew, $expectedResult) {
$this->assertSame($expectedResult, $this->object->pourDrink($brew));
}
public function pourDrinkDataProvider() {
return [['Sam', 'Adams'], ['Blue', 'Moon']];
}
}
46
https://github.com/davidalger/phpworld-talk2
@blackbooker / #phpworldFundamentals of Extending Magento 2
Running our Test
$ cd dev/tests/unit
$ phpunit ../../../app/code/Alger/Skeleton/
PHPUnit 4.8.5 by Sebastian Bergmann and contributors.
..
Time: 235 ms, Memory: 15.00Mb
OK (2 tests, 2 assertions)
47
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Our Result
48
@blackbooker / #phpworldFundamentals of Extending Magento 2
The CLI Tool
bin/magento
49
@blackbooker / #phpworldFundamentals of Extending Magento 2
Running from Anywhere
#!/usr/bin/env bash
dir="$(pwd)"
while [[ "$dir" != "/" ]]; do
if [[ -x "$dir/bin/magento" ]]; then
"$dir/bin/magento" "$@"
exit $?
fi
dir="$(dirname "$dir")"
done
>&2 echo "Error: Failed to locate bin/magento (you probably are not inside a magento site root)"
50
bit.ly/215EOYR — /usr/local/bin/magento
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Common Commands
bin/magento setup:install
bin/magento setup:upgrade
bin/magento module:enable
bin/magento module:disable
bin/magento cache:clean [type]
bin/magento cache:flush
bin/magento dev:urn-catalog:generate .idea/misc.xml
bin/magento admin:user:create
51
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Var Directories
var/page_cache
var/cache
var/composer_home
var/generation
var/di
var/view_preprocessed
cached pages
cached objects
setup wizard artifacts
generated classes
compiled DI config
compiled view components
52
http://devdocs.magento.com/guides/v2.0/howdoi/php/php_clear-dirs.html
@blackbooker / #phpworldFundamentals of Extending Magento 2
If all else fails…
rm -rf var/{cache,page_cache,generation,di,view_preprocessed}/*
53
Fundamentals of Extending Magento 2 @blackbooker / #phpworld
Keep in Touch!
54
@blackbooker
https://github.com/davidalger
http://davidalger.com
https://joind.in/14791
Developer Hub
Documentation
Community GitHub
Magento U
Vagrant Stack
http://magento.com/developers/magento2
http://devdocs.magento.com
http://github.com/magento/magento2
http://magento.com/training/catalog/magento-2
https://github.com/davidalger/devenv
Fundamentals of Extending Magento 2 - php[world] 2015

More Related Content

PDF
Magento 2 Modules are Easy!
PDF
Magento 2 Design Patterns
PDF
Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015
PDF
Magento 2: New and Innovative? - php[world] 2015
PDF
How To Install Magento 2 (updated for the latest version)
PDF
How to create theme in Magento 2 - Part 2
PDF
Magento 2 Development for PHP Developers
PDF
Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015
Magento 2 Modules are Easy!
Magento 2 Design Patterns
Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015
Magento 2: New and Innovative? - php[world] 2015
How To Install Magento 2 (updated for the latest version)
How to create theme in Magento 2 - Part 2
Magento 2 Development for PHP Developers
Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015

What's hot (20)

PPTX
MidwestPHP - Getting Started with Magento 2
PPTX
Imagine recap-devhub
PPTX
Sergii Shymko: Magento 2: Composer for Extensions Distribution
PDF
Sergii Shymko - Code migration tool for upgrade to Magento 2
PDF
Magento 2 Seminar - Daniel Genis - Magento 2 benchmarks
PDF
How To Create Theme in Magento 2 - Part 1
PDF
Oleh Kobchenko - Configure Magento 2 to get maximum performance
PPTX
Madison PHP - Getting Started with Magento 2
PPT
12 Amazing Features of Magento 2
PDF
Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015
PPTX
Magento 2 overview. Alan Kent
PDF
Magento 2: Modernizing an eCommerce Powerhouse
PDF
How to Install Magento 2 [Latest Version]
PPTX
Max Yekaterynenko: Magento 2 overview
PPTX
Magento 2 Theme Trainning for Beginners | Magenest
PPTX
Finding Your Way: Understanding Magento Code
PDF
Introduction to Magento
PDF
Magento 2 Development Best Practices
PDF
The journey of mastering Magento 2 for Magento 1 developers
PDF
How I Learned to Stop Worrying and Love Composer - php[world] 2015
MidwestPHP - Getting Started with Magento 2
Imagine recap-devhub
Sergii Shymko: Magento 2: Composer for Extensions Distribution
Sergii Shymko - Code migration tool for upgrade to Magento 2
Magento 2 Seminar - Daniel Genis - Magento 2 benchmarks
How To Create Theme in Magento 2 - Part 1
Oleh Kobchenko - Configure Magento 2 to get maximum performance
Madison PHP - Getting Started with Magento 2
12 Amazing Features of Magento 2
Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015
Magento 2 overview. Alan Kent
Magento 2: Modernizing an eCommerce Powerhouse
How to Install Magento 2 [Latest Version]
Max Yekaterynenko: Magento 2 overview
Magento 2 Theme Trainning for Beginners | Magenest
Finding Your Way: Understanding Magento Code
Introduction to Magento
Magento 2 Development Best Practices
The journey of mastering Magento 2 for Magento 1 developers
How I Learned to Stop Worrying and Love Composer - php[world] 2015
Ad

Similar to Fundamentals of Extending Magento 2 - php[world] 2015 (20)

PDF
Zepplin_Pronko_Magento_Festival Hall 1_Final
PDF
Magento 2 Backend Development Essentials
PDF
BEGINNERS’ GUIDE TO MAGENTO PLUGINS, EXTENSIONS, MODULES
PDF
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
PPTX
Zendcon magento101
PPTX
Applying Code Customizations to Magento 2
PDF
Tools out of the box with Magento 2 in PHPSTORM
PPTX
php[world] Magento101
PPTX
Magento 2 development
PDF
Intro to Magento 2: Let's build a Module!
PPTX
Make implementation of third party elements in magento 2 in 5-times easier
PPTX
How to install Magento 2 extensions.pptx
PPTX
Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
PPTX
MageConf 2017, Design API Best Practices
PPT
Meet Magento Belarus - Elena Leonova
PPTX
Magento Technical guidelines
PPTX
Virtues of platform development
PDF
Magento Meetup Mancheter with PushON: Elena Leonova
PDF
A Successful Magento Project From Design to Deployment
PPTX
Igor Miniailo - Magento 2 API Design Best Practices
Zepplin_Pronko_Magento_Festival Hall 1_Final
Magento 2 Backend Development Essentials
BEGINNERS’ GUIDE TO MAGENTO PLUGINS, EXTENSIONS, MODULES
Introduction to Magento 2 module development - PHP Antwerp Meetup 2017
Zendcon magento101
Applying Code Customizations to Magento 2
Tools out of the box with Magento 2 in PHPSTORM
php[world] Magento101
Magento 2 development
Intro to Magento 2: Let's build a Module!
Make implementation of third party elements in magento 2 in 5-times easier
How to install Magento 2 extensions.pptx
Chernivtsi Magento Meetup&Contribution day. Miniailo.I.
MageConf 2017, Design API Best Practices
Meet Magento Belarus - Elena Leonova
Magento Technical guidelines
Virtues of platform development
Magento Meetup Mancheter with PushON: Elena Leonova
A Successful Magento Project From Design to Deployment
Igor Miniailo - Magento 2 API Design Best Practices
Ad

Recently uploaded (20)

PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Mobile App Security Testing_ A Comprehensive Guide.pdf
PDF
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
PDF
Unlocking AI with Model Context Protocol (MCP)
PDF
Machine learning based COVID-19 study performance prediction
PDF
KodekX | Application Modernization Development
PPTX
Digital-Transformation-Roadmap-for-Companies.pptx
PPTX
A Presentation on Artificial Intelligence
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PPTX
MYSQL Presentation for SQL database connectivity
PPT
Teaching material agriculture food technology
PDF
Empathic Computing: Creating Shared Understanding
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PDF
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
PDF
Approach and Philosophy of On baking technology
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
NewMind AI Monthly Chronicles - July 2025
Reach Out and Touch Someone: Haptics and Empathic Computing
Mobile App Security Testing_ A Comprehensive Guide.pdf
Peak of Data & AI Encore- AI for Metadata and Smarter Workflows
Unlocking AI with Model Context Protocol (MCP)
Machine learning based COVID-19 study performance prediction
KodekX | Application Modernization Development
Digital-Transformation-Roadmap-for-Companies.pptx
A Presentation on Artificial Intelligence
NewMind AI Weekly Chronicles - August'25 Week I
MYSQL Presentation for SQL database connectivity
Teaching material agriculture food technology
Empathic Computing: Creating Shared Understanding
“AI and Expert System Decision Support & Business Intelligence Systems”
Per capita expenditure prediction using model stacking based on satellite ima...
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Bridging biosciences and deep learning for revolutionary discoveries: a compr...
Approach and Philosophy of On baking technology
Spectral efficient network and resource selection model in 5G networks
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
NewMind AI Monthly Chronicles - July 2025

Fundamentals of Extending Magento 2 - php[world] 2015

  • 1. Fundamentals of Extending Magento 2 Presented by: David Alger
  • 2. Fundamentals of Extending Magento 2 @blackbooker / #phpworld My Experience Magento developer since early 2009 Magento 1 & 2 contributor GitHub Community Moderator Director of Technology at Classy Llama 2
  • 3. @blackbooker / #phpworldFundamentals of Extending Magento 2 Platform Architecture Some highlights 3
  • 4. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Technology Stack PHP 5.6.x or 5.5.x* PSR-0 through PSR-4 HTML5 & CSS3 w/LESS JQuery w/RequireJS 3PLs ZF1, ZF2 and Symfony Apache 2.2, 2.4 / Nginx 1.8 MySQL 5.6 Composer meta-packages *There are known issues with 5.5.10–5.5.16 and 5.6.0 Optional components: • Varnish as a cache layer • Redis for sessions or page caching • Solr (search engine) 4
  • 5. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Backwards Compatibility SemVer 2.0 policy for PHP code Version numbers in MAJOR.MINOR.PATCH format • MAJOR indicates incompatible API changes • MINOR where added functionality is backward-compatible • PATCH for backward-compatible bug fixes Guaranteed BC for code with @api annotations @deprecated annotations with ~1yr later removal 5
  • 6. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Strongly Layered Presentation layer to provide view components Service layer defined interfaces for integrating with logic Domain layer to provide core business logic and base functionality Persistence layer using an active record pattern to store data 6
  • 7. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Magento Components Modules support major functionality and behavior Themes implement the interface users interact with Language packs to support i18n Vendor libraries such as ZF1, ZF1 & Symfony 7
  • 8. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Breaking it Down MagentoFramework • provides common libraries such as FS, Events, OM, etc • core application behavior such as routing • does not "know" about anything outside of itself VendorLibrary similar to framework, don't re-invent Modules,Themes & Language Packs • areas you as a developer will be working with • may fall into either of 2 categories: required or optional 8
  • 9. @blackbooker / #phpworldFundamentals of Extending Magento 2 Digging In Devil in the details 9
  • 10. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Dependency Injection Implements the constructor injection pattern Dependencies may be provided automatically Some injected dependencies must be set in XML This completely replaces the "Mage" god class in 1.x Class dependencies can be replaced via module config 10
  • 11. @blackbooker / #phpworldFundamentals of Extending Magento 2 Injecting an Interface class Norf { protected $bar; public function __construct(BarInterface $bar) { $this->bar = $bar; parent::__construct(); } } 11
  • 12. @blackbooker / #phpworldFundamentals of Extending Magento 2 Preferred Implementation <?xml version="1.0"?> <config xmlns:xsi="..." xsi:noNamespaceSchemaLocation="..."> <preference for="BarInterface" type="Bar" /> </config 12 etc/di.xml
  • 13. @blackbooker / #phpworldFundamentals of Extending Magento 2 DI Proxies <type name="FooBarModelBaz" shared="false"> <arguments> <argument name="norf" xsi:type="object">FooBarModelNorf</argument> </arguments> </type> 13
  • 14. @blackbooker / #phpworldFundamentals of Extending Magento 2 Plugins Plugins work using technique called interception They are implemented in context of a module You write your plugins; interceptor code is generated Can wrap around, be called before/after class methods 14 http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html
  • 15. @blackbooker / #phpworldFundamentals of Extending Magento 2 Declaring the Plugin <?xml version="1.0"?> <config xmlns:xsi="..." xsi:noNamespaceSchemaLocation="..."> <type name="FooBarModelNorf"> <plugin name="Foo_Bar::Qux" type="FooBarPluginQux"/> </type> </config> 15 etc/di.xml
  • 16. @blackbooker / #phpworldFundamentals of Extending Magento 2 Intercepting Before class Qux { public function beforeSetBaz(Norf $subject, $baz) { // modify baz return [$baz]; } } 16 Plugin/Qux.php
  • 17. @blackbooker / #phpworldFundamentals of Extending Magento 2 Intercepting After class Qux { public function afterGetBaz(Norf $subject, $result) { // modify result return $result; } } 17 Plugin/Qux.php
  • 18. @blackbooker / #phpworldFundamentals of Extending Magento 2 Wrapping Around class Qux { public function aroundBaztastic(Norf $subject, Closure $proceed) { // do something before $result = $proceed(); if ($result) { // do something really cool } return $result; } } 18 Plugin/Qux.php
  • 19. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Where can you Plugin? Anywhere except for… • final methods / classes • non-public methods • class methods • __construct 19 http://devdocs.magento.com/guides/v2.0/extension-dev-guide/plugins.html
  • 20. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Code Generation Auto-generates code to create non-existent classes This is based on convention such as *Factory classes You can still see and debug the code in var/generation In development mode these are created in autoloader Production mode expects pre-compilation via CLI tool 20
  • 21. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Factory Pattern Single purpose objects used to create object instances Isolate the object manager from business logic Instead of injecting ObjectManager, use a *Factory Uniform pattern interface since they are generated 21
  • 22. @blackbooker / #phpworldFundamentals of Extending Magento 2 BaseFactory class BaseFactory { protected $objectManager; public function __construct(ObjectManager $objectManager) { $this->objectManager = $objectManager; } public function create($sourceData = null) { return $this->objectManager->create('Base', ['sourceData' => $sourceData]); } } 22
  • 23. @blackbooker / #phpworldFundamentals of Extending Magento 2 Using a Factory class Norf { protected $barFactory; public function __construct(BarFactory $barFactory) { $this->barFactory = $barFactory; parent::__construct(); } /** returns Bar object instantiated by object manager */ public function createBar() { return $this->barFactory->create(); } } 23
  • 24. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Component Management All components installed via composer Register component so Magento knows it's there Composer auto-loader used to load registration.php Any app/code/*/*/registration.php loaded in bootstrap 24
  • 25. @blackbooker / #phpworldFundamentals of Extending Magento 2 Component Registration use MagentoFrameworkComponentComponentRegistrar; ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Foo_Bar', __DIR__); 25 registration.php
  • 26. @blackbooker / #phpworldFundamentals of Extending Magento 2 Autoload Configuration { "name": "foo/bar-component", "autoload": { "psr-4": { "FooBarComponent": "" }, "files": [ "registration.php" ] } } 26 composer.json
  • 27. @blackbooker / #phpworldFundamentals of Extending Magento 2 Component registration for everything! 27
  • 28. @blackbooker / #phpworldFundamentals of Extending Magento 2 Installing Magento 2 Starting your first project 28
  • 29. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Which install method? Getting the source • Complete tarball • Composer meta-packages • GitHub clone App installation • Command line `bin/magento` tool • GUI wizard 29 http://devdocs.magento.com/guides/v2.0/install-gde/continue.html
  • 30. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Installing from GitHub Used to contribute back to core via PRs Sample data may still be installed, but messier 30
  • 31. @blackbooker / #phpworldFundamentals of Extending Magento 2 Installing from GitHub $ mkdir -p /server/sites/m2.dev $ cd /server/sites/m2.dev $ git clone /server/.shared/m2.repo ./ && git checkout 2.0.0 $ composer install --no-interaction --prefer-dist $ mysql -e 'create database m2_dev' $ bin/magento setup:install --base-url=http://m2.dev --backend-frontname=backend --admin-user=admin --admin-firstname=Admin --admin-lastname=Admin --admin-email=user@example.com --admin-password=A123456 --db-host=dev-db --db-user=root --db-name=m2_dev $ mkdir -p /server/sites/m2.dev/var/.m2-data && pushd /server/sites/m2.dev/var/.m2-data $ git clone -q /server/.shared/m2-data.repo ./ && git checkout 2.0.0 && popd $ php -f /server/sites/m2.dev/var/.m2-data/dev/tools/build-sample-data.php -- --ce-source=/server/sites/m2.dev $ bin/magento setup:upgrade $ bin/magento cache:flush 31 bit.ly/1NFrVep
  • 32. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Installing via Composer Use of meta-packages provide you more control Clear separation between custom / vendor code Sample data is a snap to install Best method to use for site builds and other projects 32
  • 33. @blackbooker / #phpworldFundamentals of Extending Magento 2 Installing via Composer $ cd /sites $ composer create-project --repository-url=https://repo.magento.com/ magento/project-community-edition m2.demo $ cd m2.demo $ chmod +x bin/magento $ bin/magento sampledata:deploy $ composer update # this line here because bugs... fix on it's way $ mysql -e 'create database m2_demo' $ bin/magento setup:install --base-url=http://m2.demo --backend-frontname=backend --admin-user=admin --admin-firstname=Admin --admin-lastname=Admin --admin-email=user@example.com --admin-password=A123456 --db-host=dev-db --db-user=root --db-name=m2_demo 33 bit.ly/1H8P249
  • 34. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Installing for Shared Hosting Tarballs for "easy" install method on shared hosting Essentially same code produced via composer install Can be readily used where CLI access is not to be had After install can be maintained with composer 34
  • 35. @blackbooker / #phpworldFundamentals of Extending Magento 2 GUI Wizard vs CLI Install is your choice 35
  • 36. @blackbooker / #phpworldFundamentals of Extending Magento 236
  • 37. @blackbooker / #phpworldFundamentals of Extending Magento 2 Makings of a Module Starting with a skeleton 37
  • 38. @blackbooker / #phpworldFundamentals of Extending Magento 2 Module Organization 38
  • 39. @blackbooker / #phpworldFundamentals of Extending Magento 2 Skeleton app/code/Alger └── Skeleton ├── composer.json ├── etc │   └── module.xml └── registration.php 39 https://github.com/davidalger/phpworld-talk2 — initial commit
  • 40. @blackbooker / #phpworldFundamentals of Extending Magento 2 registration.php use MagentoFrameworkComponentComponentRegistrar; ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Alger_Skeleton', __DIR__); 40 https://github.com/davidalger/phpworld-talk2
  • 41. @blackbooker / #phpworldFundamentals of Extending Magento 2 module.xml <?xml version="1.0"?> <config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd"> <module name="Alger_Skeleton" setup_version="1.0.0" /> </config> 41 https://github.com/davidalger/phpworld-talk2
  • 42. @blackbooker / #phpworldFundamentals of Extending Magento 2 composer.json { "name": "alger/module-skeleton", "type": "magento2-module", "require": { "magento/framework": "*" }, "autoload": { "files": [ "registration.php" ], "psr-4": { "AlgerSkeleton": "" } } } 42 https://github.com/davidalger/phpworld-talk2
  • 43. @blackbooker / #phpworldFundamentals of Extending Magento 2 Installing from GitHub $ composer config repositories.alger/phpworld-talk2 vcs git@github.com:davidalger/phpworld-talk2.git $ composer require alger/module-skeleton:dev-master $ bin/magento setup:upgrade -q && bin/magento cache:flush -q $ git clone git@github.com:davidalger/phpworld-talk2.git app/code/Alger/Skeleton $ bin/magento module:enable Alger_Skeleton $ bin/magento setup:upgrade -q && bin/magento cache:flush -q 43 bit.ly/1MWbb1E OR
  • 44. @blackbooker / #phpworldFundamentals of Extending Magento 2 Example Block namespace AlgerSkeletonBlock; use AlgerSkeletonHelperBar; use MagentoFrameworkViewElementTemplate; use MagentoFrameworkViewElementTemplateContext; class Norf extends Template { protected $bar; public function __construct(Bar $bar, Context $context, array $data = []) { $this->bar = $bar; parent::__construct($context, $data); } public function getDrinksCallout() { return 'Helper your self to an ' . implode(' or a ', $this->bar->getDrinks()) . '!'; } } 44 Block/Norf.php
  • 45. @blackbooker / #phpworldFundamentals of Extending Magento 2 Using the Block <?xml version="1.0"?> <page xmlns:xsi="..." xsi:noNamespaceSchemaLocation="..."> <body> <referenceContainer name="page.top"> <block class="AlgerSkeletonBlockNorf" template="Alger_Skeleton::banner.phtml"/> </referenceContainer> </body> </page> 45 https://github.com/davidalger/phpworld-talk2
  • 46. @blackbooker / #phpworldFundamentals of Extending Magento 2 Unit Testing namespace AlgerSkeletonTestUnit; use MagentoFrameworkTestFrameworkUnitHelperObjectManager; class HelperTest extends PHPUnit_Framework_TestCase { protected $object; protected function setUp() { $this->object = (new ObjectManager($this))->getObject('AlgerSkeletonHelperBar'); } /** @dataProvider pourDrinkDataProvider */ public function testPourDrink($brew, $expectedResult) { $this->assertSame($expectedResult, $this->object->pourDrink($brew)); } public function pourDrinkDataProvider() { return [['Sam', 'Adams'], ['Blue', 'Moon']]; } } 46 https://github.com/davidalger/phpworld-talk2
  • 47. @blackbooker / #phpworldFundamentals of Extending Magento 2 Running our Test $ cd dev/tests/unit $ phpunit ../../../app/code/Alger/Skeleton/ PHPUnit 4.8.5 by Sebastian Bergmann and contributors. .. Time: 235 ms, Memory: 15.00Mb OK (2 tests, 2 assertions) 47
  • 48. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Our Result 48
  • 49. @blackbooker / #phpworldFundamentals of Extending Magento 2 The CLI Tool bin/magento 49
  • 50. @blackbooker / #phpworldFundamentals of Extending Magento 2 Running from Anywhere #!/usr/bin/env bash dir="$(pwd)" while [[ "$dir" != "/" ]]; do if [[ -x "$dir/bin/magento" ]]; then "$dir/bin/magento" "$@" exit $? fi dir="$(dirname "$dir")" done >&2 echo "Error: Failed to locate bin/magento (you probably are not inside a magento site root)" 50 bit.ly/215EOYR — /usr/local/bin/magento
  • 51. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Common Commands bin/magento setup:install bin/magento setup:upgrade bin/magento module:enable bin/magento module:disable bin/magento cache:clean [type] bin/magento cache:flush bin/magento dev:urn-catalog:generate .idea/misc.xml bin/magento admin:user:create 51
  • 52. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Var Directories var/page_cache var/cache var/composer_home var/generation var/di var/view_preprocessed cached pages cached objects setup wizard artifacts generated classes compiled DI config compiled view components 52 http://devdocs.magento.com/guides/v2.0/howdoi/php/php_clear-dirs.html
  • 53. @blackbooker / #phpworldFundamentals of Extending Magento 2 If all else fails… rm -rf var/{cache,page_cache,generation,di,view_preprocessed}/* 53
  • 54. Fundamentals of Extending Magento 2 @blackbooker / #phpworld Keep in Touch! 54 @blackbooker https://github.com/davidalger http://davidalger.com https://joind.in/14791 Developer Hub Documentation Community GitHub Magento U Vagrant Stack http://magento.com/developers/magento2 http://devdocs.magento.com http://github.com/magento/magento2 http://magento.com/training/catalog/magento-2 https://github.com/davidalger/devenv