20162016
@JoshuaSWarren #phpworld
Magento 2 Development
for PHP Developers
@JoshuaSWarren #phpworld
Is Your Environment
Ready?
@JoshuaSWarren #phpworld
MageScotch
• How many of you downloaded it in advance?
• Anyone need help?
• If you haven’t installed it, follow the instructions at bit.ly/
2eYkhon
@JoshuaSWarren #phpworld
About Me
@JoshuaSWarren #phpworld
About Me
• PHP-Based Ecommerce Developer Since 1999
• Magento Developer Since 2008; Magento 2 Developer Since
2014
• Magento Master
• Founder & CEO of Creatuity Corp, Magento Enterprise
Solution Partner
@JoshuaSWarren #phpworld
About This Tutorial
@JoshuaSWarren #phpworld
Assumptions
• You’re a PHP developer
• You have little-to-no experience with Magento 1 or 2
• You have a laptop and a desire to learn about Magento 2
@JoshuaSWarren #phpworld
Goals
• Knowledge of the basics of M2 development
• A clear path to learn more
• An invitation to the Magento development community
@JoshuaSWarren #phpworld
Style
• Light-hearted & open - have fun + don’t hesitate to be blunt
• Interactive - do not hold questions to the end
• Customized - want more code? More theory? Just ask!
@JoshuaSWarren #phpworld
About You
@JoshuaSWarren #phpworld
About You
• Any Magento 1 experience?
• Any Magento 2 experience?
• PHP 7 experience?
@JoshuaSWarren #phpworld
About You
• Experience with other frameworks?
• Composer?
• Namespaces?
@JoshuaSWarren #phpworld
About You
• Dependency injection?
• Service layers?
@JoshuaSWarren #phpworld
@JoshuaSWarren #phpworld
About You
• Looking for detailed code examples?
• Want to get your hands dirty with some code today?
• Interested more in theory?
@JoshuaSWarren #phpworld
Useful Tools & Sites
@JoshuaSWarren #phpworld
Useful Sites for a New M2 Dev
• Magento DevDocs - devdocs.magento.com
• Magento Stack Exchange - magento.stackexchange.com
• github.com/Creatuity/LearningMagento2
• Alan Storm’s Sites - alanstorm.com + magento-
quickies.alanstorm.com
@JoshuaSWarren #phpworld
Social Media for a New M2 Dev
• Twitter - hashtag #realmagento
• Magento’s Developer Evangelist - @benmarks
• Alan Storm - @alanstorm
• And many, many others…
@JoshuaSWarren #phpworld
Useful Tools for a New M2 Dev
• IDE: PHPStorm
• Magicento or JetBrains Magento 2 Plugin
• A Vagrant or Docker image for local development
• Sample code: github.com/magento/magento2-samples
@JoshuaSWarren #phpworld
Useful Tools for a New M2 Dev
• Magento 2 is a constantly evolving platform. Keep your
skills up to date and keep an eye out for new tools to assist
you.
@JoshuaSWarren #phpworld
Technical Architecture of
Magento 2
@JoshuaSWarren #phpworld
Beginner’s Mind
• If you have experience with Magento 1, try to set it aside
• Magento 2 rewards Shoshin - a beginner’s mind
• Start with the basic architectural concepts in Magento 2
@JoshuaSWarren #phpworld
Composer
• Magento 2 is built on top of Composer
• Each module/extension can and should be a Composer
module
• This includes each core module in the Magento 2 core
@JoshuaSWarren #phpworld
PSR’s All The Way Down
• PSR-0 thru PSR-4 (Autoloader)
@JoshuaSWarren #phpworld
phpunit, Selenium, JMeter,
Jasmine and more all built in
@JoshuaSWarren #phpworld
Advanced Front-end Tech
• LESS CSS (And SASS*)
• jQuery
• RequireJS
• Gulp.js
• Magento UI Library
@JoshuaSWarren #phpworld
Layers upon layers…
@JoshuaSWarren #phpworld
Layers
• Presentation layer
• Service Layer
• Domain Layer
• Persistence Layer
@JoshuaSWarren #phpworld
Dependency Injection
• Dependencies are injected into objects that need them
• “Don’t call us, we’ll call you”
• Instead of building an object in your class, it’s passed in via
your constructor, automatically.
@JoshuaSWarren #phpworld
Dependency Injection
• Reduces dependencies
• Promotes loose coupling
• Improves testability
@JoshuaSWarren #phpworld
Dependency Injection
• Magento 2 uses the Constructor Injection pattern of DI
• Automatic Dependency Injection
• Handled in Magento 2 via XML files
@JoshuaSWarren #phpworld
Without Dependency Injection
public function getFormattedPrice($sku)

{

$db = new DBHandler;

$row = $db->query('SELECT price FROM products WHERE sku = ?', $sku);

$formatter = new PriceFormatter;

return $formatter->asDollars($row['price']);

}
@JoshuaSWarren #phpworld
With Dependency Injection
public function getFormattedPrice($sku, $db, $formatter)

{

$row = $db->query('SELECT price FROM products WHERE sku = ?', $sku);

return $formatter->asDollars($row['price']);

}
@JoshuaSWarren #phpworld
Interceptors
• Calls to almost any module can be intercepted and altered
• Possible to intercept before, after or around a function
@JoshuaSWarren #phpworld
Helpful Less-Technical M2 Concepts
• Magento can power multiple websites on one installation
• Websites -> Stores -> Store Views
• Translation & currency exchange system built in
@JoshuaSWarren #phpworld
Helpful Less-Technical M2 Concepts
• Built-in CMS system
• Static Blocks
• Widgets
@JoshuaSWarren #phpworld
Helpful Less-Technical M2 Concepts
• Modular product & customer attributes
• Pre-made extensions available on
marketplace.magento.com
• Two editions - Community Edition & Enterprise Edition
@JoshuaSWarren #phpworld
A Few Cautions
• Magento 2 is a work in progress
• Service contracts are incomplete
• Not all core code has been refactored
• Best practices are still being determined
• Check devdocs, Stack Exchange best-practice tag, blogs &
presentations
@JoshuaSWarren #phpworld
Thoughts & Questions So Far?
@JoshuaSWarren #phpworld
Setting Up a New
Magento 2 Site
@JoshuaSWarren #phpworld
Multiple Options
• Easy Install: Download zip file, run web installer
• System Integrator: Composer-based, run web or CLI installer
• Contributing Developer: Clone Magento 2 repository
@JoshuaSWarren #phpworld
Start with a Virtual Machine
• MageScotch follows the contributing developer approach to
Magento 2 development
• Magento 2 repository is checked out to /opt/magento2
• It’s then copied to /var/www/public/magento2
@JoshuaSWarren #phpworld
Start with a Virtual Machine
• Starting with a VM simplifies the process and ensures you
have a working environment
• Provides you with the additional tools you need such as the
proper PHP version (7) and Composer
@JoshuaSWarren #phpworld
Starting an M2 Project
• Understand your end goal for the project
• Take time to map business requirements to existing
Magento 2 functionality and modules
• Complete as much as you can in the admin panel
@JoshuaSWarren #phpworld
Starting an M2 Project
• Any business logic customizations should be completed via
a Magento 2 module
• Purely cosmetic changes should take place as a custom
theme
• Whatever you do, don’t edit core files
@JoshuaSWarren #phpworld
Writing a Magento 2 Module
@JoshuaSWarren #phpworld
Magento 2 Modules
• Magento 2 modules can do anything
• Provide new shipping methods & payment gateway
integrations
• Implement entirely new ordering workflows
• Make simple, minor changes to functionality
@JoshuaSWarren #phpworld
Magento 2 Modules
• Magento 2 modules can be implemented within your
existing codebase - magento2/app/code/Namespace/
Module
• Magento 2 modules can also be freestanding modules with
their own Git repository you install using Composer
@JoshuaSWarren #phpworld
Magento 2 Modules
• All Magento 2 modules have a few things in common
• composer.json
• registration.php
• etc/module.xml
• Most also have etc/di.xml
@JoshuaSWarren #phpworld
composer.json
{
"name": "magento/sample-module-minimal",
"description": "A minimal skeleton Magento 2 module",
"type": "magento2-module",
"version": "1.0.0",
"require": {
"php": "~5.5.0|~5.6.0|~7.0.0"
},
"autoload": {
"files": [ "registration.php" ],
"psr-4": {
"MagentoSampleMinimal": ""
}
}
}
@JoshuaSWarren #phpworld
registration.php
<?php
MagentoFrameworkComponentComponentRegistrar::register(
MagentoFrameworkComponentComponentRegistrar::MODULE,
'Magento_SampleMinimal',
__DIR__
);
@JoshuaSWarren #phpworld
etc/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="Magento_SampleMinimal" setup_version="2.0.0">
</module>
</config>
@JoshuaSWarren #phpworld
etc/di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="MagentoFrameworkConsoleCommandList">
<arguments>
<argument name="commands" xsi:type="array">
<item name="write_yaml_command" xsi:type=“object">
CreatuityBlackfireCommandsConsoleCommandWriteYamlCommand
</item>
<item name=“profile_category_command" xsi:type=“object">
CreatuityBlackfireCommandsConsoleCommandProfileCategoryCommand
</item>
</argument>
</arguments>
</type>
</config>
@JoshuaSWarren #phpworld
Interesting Examples
• github.com/magento/magento2-samples/tree/master/
sample-module-modifycontent
• github.com/magento/magento2-samples/tree/master/
sample-module-interception
• github.com/magento/magento2-samples/tree/master/
sample-module-payment-gateway
• github.com/creatuity/magento2-blackfire-commands
@JoshuaSWarren #phpworld
Recommendations
• When building a new site, write many simple modules for
each distinct customization, not one large module
• Name modules in a logical manner based on the
functionality they provide
• Don’t reinvent the wheel. Use libraries on Packagist and
open source modules where possible.
@JoshuaSWarren #phpworld
Questions?
@JoshuaSWarren #phpworld
Designing Magento 2 Sites
@JoshuaSWarren #phpworld
Themes, Layouts and Templates
• A Magento website runs a theme
• Magento fully supports parent/child theme relationships
• Don’t edit the core theme. Create a new child theme that
inherits from the core Luma or Blank themes.
@JoshuaSWarren #phpworld
Themes, Layouts and Templates
• A theme consists of layouts and templates
• Layouts are XML files that explain what blocks and
containers appear on a page
• Templates are PHTML files that contain HTML markup for a
specific page or section of a page
@JoshuaSWarren #phpworld
Stylesheets & Preprocessing
• Magento 2 utilizes the LESS CSS preprocessor
• LESS allows you to use variables, mixins and rules in your
CSS
• Modify LESS files and then compile them into CSS. Don’t
modify CSS files directly.
@JoshuaSWarren #phpworld
Sample
• https://github.com/ubertheme/crafts-magento-2-theme
@JoshuaSWarren #phpworld
Questions?
@JoshuaSWarren #phpworld
Deploying Magento 2 Sites
@JoshuaSWarren #phpworld
No, seriously, hold on…
@JoshuaSWarren #phpworld
The official Magento 2 documentation
on deploying to production…
@JoshuaSWarren #phpworld
One Option…
• Upload all files to your server
• bin/magento setup:upgrade
• bin/magento setup:di:compile
• bin/magento deploy:mode:set production
• bin/magento setup:static-content:deploy
@JoshuaSWarren #phpworld
Check Your Infrastructure
• Magento Enterprise supports Varnish out of the box - use it
• Please don’t deploy on $5/month hosting
• Configure Magento to use Redis for cache storage
@JoshuaSWarren #phpworld
Questions?
@JoshuaSWarren #phpworld
Examples & Exercises
@JoshuaSWarren #phpworld
Real World Examples
• http://panhandleww.com/
• http://stickyholsters.com
@JoshuaSWarren #phpworld
Exercises
• What do you want to try in Magento 2?
@JoshuaSWarren #phpworld
Next Steps
@JoshuaSWarren #phpworld
php[world] sessions
• Magento 2 Performance Talk
• Wednesday, 3PM, Ash Grove C
• Automating Your Workflow With Gulp.js
• Thursday, 11:30AM, Great Falls
• Magento 2 Development Best Practices
• Friday, 10AM, Ash Grove A
@JoshuaSWarren #phpworld
Future Events
• Magento 2 Performance Training - January 18th-20th in
Orlando with Ivan Chepurnyi - http://bit.ly/2eAo8cz
• Magento Imagine 2017 - April 3rd-5th in Las Vegas -
imagine.magento.com 

@JoshuaSWarren #phpworld
Stay in Touch
• Never hesitate to ask questions via Twitter -
@JoshuaSWarren or on Stack Exchange
• Questions today?
@JoshuaSWarren #phpworld
Go build something awesome!

Magento 2 Development for PHP Developers