Slide 1

Slide 1 text

PRESENTED BY JOSHUA WARREN PRESENTED AT ZENDCON 2015 Magento 2 AN INTRODUCTION TO A MODERN PHP- BASED SYSTEM

Slide 2

Slide 2 text

No content

Slide 3

Slide 3 text

JoshuaWarren.com 150 slides in ~50 minutes lots of code focus on the concepts, download the slides later #ZendCon

Slide 4

Slide 4 text

MY EXPERIENCE

Slide 5

Slide 5 text

JoshuaWarren.com My Experience PHP Developer Since 1999 Founded Creatuity in 2008 Focused on the Magento platform Magento 2 contributor #ZendCon

Slide 6

Slide 6 text

JoshuaWarren.com early adopter of both Magento 1 and Magento 2 #ZendCon

Slide 7

Slide 7 text

JoshuaWarren.com Frequent Magento presenter #ZendCon

Slide 8

Slide 8 text

JoshuaWarren.com Led the Creatuity team in building 3 Magento 2 extensions (more on the way!) #ZendCon

Slide 9

Slide 9 text

JoshuaWarren.com Already migrating a few merchants from Magento 1 to Magento 2 #ZendCon

Slide 10

Slide 10 text

JoshuaWarren.com Wrote Writing the book on Magento 2 #ZendCon

Slide 11

Slide 11 text

JoshuaWarren.com Not a Magento employee, but working closely with the development, documentation & product teams on Magento 2 #ZendCon

Slide 12

Slide 12 text

A BRIEF HISTORY OF MAGENTO Photo courtesy of @YoavKutner

Slide 13

Slide 13 text

JoshuaWarren.com Magento 1 development began in 2007 by Varien, a PHP development agency. #ZendCon

Slide 14

Slide 14 text

JoshuaWarren.com A look at the state of the art when Magento 1 was built PHP & Ecommerce in 2007 osCommerce is state of the art Cloud-based / SaaS ecommerce doesn’t exist yet PHP 5.2 is cutting-edge Composer doesn’t exist - PHP has no dependency management There’s this new thing called ZF, otherwise it’s Cake or Symfony Testing? You might find a few people using PHPUnit #ZendCon

Slide 15

Slide 15 text

JoshuaWarren.com The Painful World of osCommerce PHP & Ecommerce in 2007 Want to add an attribute? Modify your database schema on live. Looking at add new features? Modify core PHP files. Want to upgrade your store? Good luck! #ZendCon

Slide 16

Slide 16 text

JoshuaWarren.com Magento 1 was built to resolve the pain points of osCommerce. #ZendCon

Slide 17

Slide 17 text

JoshuaWarren.com Designed to be more flexible and to provide standardized ways to customize the platform. #ZendCon

Slide 18

Slide 18 text

JoshuaWarren.com By 2010, Magento had been downloaded 1.5 million times. #ZendCon

Slide 19

Slide 19 text

JoshuaWarren.com Attracted by Magento’s free, open- source approach, hundreds of thousands of sites were launched using Magento 1 #ZendCon

Slide 20

Slide 20 text

JoshuaWarren.com There’s just one problem… #ZendCon

Slide 21

Slide 21 text

JoshuaWarren.com Ecommerce development is hard. #ZendCon

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

JoshuaWarren.com Lightly documented ecommerce development is even harder. #ZendCon

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

JoshuaWarren.com Varien, now known as Magento Inc, is acquired by eBay in 2011. #ZendCon

Slide 26

Slide 26 text

JoshuaWarren.com Work begins on Magento 2 almost immediately. #ZendCon

Slide 27

Slide 27 text

JoshuaWarren.com Now the most widely-used eCommerce platform, powering over 250,000 sites, expectations are high for the Magento 2 team. #ZendCon

Slide 28

Slide 28 text

JoshuaWarren.com Fewer than 30 commits are made to Magento 2 in 2012. #ZendCon

Slide 29

Slide 29 text

JoshuaWarren.com Internal priorities continue to shift, and finally at the end of 2014, Magento 2 development is made public on Github. #ZendCon

Slide 30

Slide 30 text

JoshuaWarren.com Magento commits to a release schedule for Magento 2, and announces the acceptance of pull requests. #ZendCon

Slide 31

Slide 31 text

JoshuaWarren.com devdocs.magento.com launches with significant documentation of Magento 2. #ZendCon

Slide 32

Slide 32 text

JoshuaWarren.com Developer Beta is released in December 2014; Merchant Beta in July 2015 #ZendCon

Slide 33

Slide 33 text

JoshuaWarren.com Production-ready release scheduled for Q4 2015 #ZendCon

Slide 34

Slide 34 text

Timely Twitter Question! JoshuaWarren.com #ZendCon

Slide 35

Slide 35 text

JoshuaWarren.com Magento 2 team has committed to quarterly releases. I’m targeting the Q1 2016 release for more cautious brands. #ZendCon

Slide 36

Slide 36 text

Timely Twitter Answer about Q1 Release JoshuaWarren.com #ZendCon

Slide 37

Slide 37 text

JoshuaWarren.com A quick note for any Magento 1 developers in the audience… #ZendCon

Slide 38

Slide 38 text

JoshuaWarren.com #ZendCon

Slide 39

Slide 39 text

JoshuaWarren.com …for PHP developers new to Magento. #ZendCon

Slide 40

Slide 40 text

JoshuaWarren.com PHP developers are learning Magento 2 faster than many Magento 1 developers. #ZendCon

Slide 41

Slide 41 text

JoshuaWarren.com Approach Magento 2 with a desire to learn and understand the underlying patterns. #ZendCon

Slide 42

Slide 42 text

JoshuaWarren.com Don’t approach Magento 2 with the thought “how do I make my Magento 1 code work here” #ZendCon

Slide 43

Slide 43 text

JoshuaWarren.com With that mind, let’s dive into Magento 2… #ZendCon

Slide 44

Slide 44 text

MAGENTO 2 github.com/magento/magento2

Slide 45

Slide 45 text

JoshuaWarren.com Technologies #ZendCon

Slide 46

Slide 46 text

JoshuaWarren.com #ZendCon Composer composer create-project magento/product-community-edition --stability="beta"

Slide 47

Slide 47 text

JoshuaWarren.com Each Magento 2 module is a separate Composer package #ZendCon

Slide 48

Slide 48 text

JoshuaWarren.com PSR-0 thru PSR-4 #ZendCon

Slide 49

Slide 49 text

JoshuaWarren.com Testing built in from the start. phpunit, selenium, JMeter, Jasmine #ZendCon

Slide 50

Slide 50 text

JoshuaWarren.com HTML5, CSS3, LESS CSS Preprocessor, JQuery, RequireJS #ZendCon

Slide 51

Slide 51 text

JoshuaWarren.com Components from Zend Framework 1, Zend Framework 2, Symfony #ZendCon

Slide 52

Slide 52 text

JoshuaWarren.com Technical Architecture #ZendCon

Slide 53

Slide 53 text

JoshuaWarren.com Presentation Layer, Service Layer, Domain Layer, Persistence Layer #ZendCon

Slide 54

Slide 54 text

JoshuaWarren.com #ZendCon

Slide 55

Slide 55 text

JoshuaWarren.com Presentation Layer - views, literally and figuratively #ZendCon

Slide 56

Slide 56 text

JoshuaWarren.com Service Layer - an intermediary between the presentation and model layers #ZendCon

Slide 57

Slide 57 text

JoshuaWarren.com Service layer provides a stable, backwards-compatible interface and forms the foundation for dependency injection. #ZendCon

Slide 58

Slide 58 text

JoshuaWarren.com Domain layer - business logic, including models. Contains the implementation of service contracts. #ZendCon

Slide 59

Slide 59 text

JoshuaWarren.com Persistence Layer - resource models that perform CRUD operations on database tables. #ZendCon

Slide 60

Slide 60 text

JoshuaWarren.com Some models use a single table, others continue to use the Entity-Attribute-Value design pattern used in Magento 1. #ZendCon

Slide 61

Slide 61 text

JoshuaWarren.com Design Patterns #ZendCon

Slide 62

Slide 62 text

JoshuaWarren.com Loose Coupling #ZendCon

Slide 63

Slide 63 text

JoshuaWarren.com Dependency Injection #ZendCon

Slide 64

Slide 64 text

JoshuaWarren.com Service Contracts #ZendCon

Slide 65

Slide 65 text

JoshuaWarren.com Interceptors #ZendCon

Slide 66

Slide 66 text

JoshuaWarren.com Semantic Versioning #ZendCon

Slide 67

Slide 67 text

JoshuaWarren.com Start your Magento 2 journey learning the basics of these design patterns #ZendCon

Slide 68

Slide 68 text

DEPENDENCY INJECTION Sorry - no cool photo here, because I don’t like needles…

Slide 69

Slide 69 text

JoshuaWarren.com DI is exactly what it sounds like - injecting dependencies into the objects that need them. #ZendCon

Slide 70

Slide 70 text

JoshuaWarren.com DI is designed to reduce dependencies and promote loose coupling #ZendCon

Slide 71

Slide 71 text

JoshuaWarren.com DI makes unit testing much easier #ZendCon

Slide 72

Slide 72 text

JoshuaWarren.com Magento 2 uses the Constructor Injection pattern of DI #ZendCon

Slide 73

Slide 73 text

JoshuaWarren.com DI in Magento 2 is handled via XML files #ZendCon

Slide 74

Slide 74 text

JoshuaWarren.com #ZendCon di.xml 
 
 
 Magento_SamplePaymentProvider::form/payinstore.phtml 
 
 
 


Slide 75

Slide 75 text

INTERCEPTORS

Slide 76

Slide 76 text

JoshuaWarren.com Plugin system based on the interceptor pattern #ZendCon

Slide 77

Slide 77 text

JoshuaWarren.com Calls to almost any module can be intercepted and altered #ZendCon

Slide 78

Slide 78 text

JoshuaWarren.com Vast improvement over the rewrite pattern in Magento 1 - no more rewrite conflicts #ZendCon

Slide 79

Slide 79 text

JoshuaWarren.com #ZendCon di.xml 
 
 
 


Slide 80

Slide 80 text

JoshuaWarren.com Sort order defines order if multiple plugins intercept the same item #ZendCon

Slide 81

Slide 81 text

JoshuaWarren.com Possible to intercept before, after and around a function #ZendCon

Slide 82

Slide 82 text

JoshuaWarren.com #ZendCon ‘Before’ Interceptor class Plugin
 {
 public function beforeSetName(\Magento\Catalog\Model\Product $subject, $name)
 {
 return array('(' . $name . ')');
 }
 }

Slide 83

Slide 83 text

JoshuaWarren.com #ZendCon ‘After’ Interceptor class Plugin
 {
 public function afterGetName(\Magento\Catalog\Model\Product $subject, $result)
 {
 return '|' . $result . '|';
 }
 }

Slide 84

Slide 84 text

JoshuaWarren.com #ZendCon ‘Around’ Interceptor class Plugin
 {
 public function aroundSave(\Magento\Catalog\Model\Product $subject, \Closure $proceed)
 {
 $this->doSomethingBeforeProductIsSaved();
 $returnValue = $proceed();
 if ($returnValue) {
 $this->postProductToFacebook();
 }
 return $returnValue;
 }
 }

Slide 85

Slide 85 text

SERVICE CONTRACTS Credit to Allan MacGregor for the Soylent Green joke.

Slide 86

Slide 86 text

JoshuaWarren.com Set of interfaces to define the public API of a module #ZendCon

Slide 87

Slide 87 text

JoshuaWarren.com This API is the interface provided to other modules to access its implementation #ZendCon

Slide 88

Slide 88 text

JoshuaWarren.com Designed to hide business logic behind a stable interface #ZendCon

Slide 89

Slide 89 text

JoshuaWarren.com Service contracts + semantic versioning = minor releases will not break existing code #ZendCon

Slide 90

Slide 90 text

JoshuaWarren.com @deprecated = will be removed with the next major version release #ZendCon

Slide 91

Slide 91 text

JoshuaWarren.com #ZendCon CustomerRepositoryInterface.php 
 namespace Magento\Customer\Api;
 /**
 * Customer CRUD interface.
 */
 interface CustomerRepositoryInterface
 {
 /**
 * Create customer.
 *
 * @api
 * @param \Magento\Customer\Api\Data\CustomerInterface $customer
 * @param string $passwordHash
 * @return \Magento\Customer\Api\Data\CustomerInterface
 * @throws \Magento\Framework\Exception\InputException If bad input is provided
 * @throws \Magento\Framework\Exception\State\InputMismatchException If the provided email is already used
 * @throws \Magento\Framework\Exception\LocalizedException
 */
 public function save(\Magento\Customer\Api\Data\CustomerInterface $customer, $passwordHash = null);

Slide 92

Slide 92 text

JoshuaWarren.com #ZendCon CustomerRepositoryInterface.php /**
 * Retrieve customer.
 *
 * @api
 * @param string $email
 * @param int|null $websiteId
 * @return \Magento\Customer\Api\Data\CustomerInterface
 * @throws \Magento\Framework\Exception\NoSuchEntityException If customer with the specified email does not exist.
 * @throws \Magento\Framework\Exception\LocalizedException
 */
 public function get($email, $websiteId = null);
 /**
 * Retrieve customer.
 *
 * @api
 * @param int $customerId
 * @return \Magento\Customer\Api\Data\CustomerInterface
 * @throws \Magento\Framework\Exception\NoSuchEntityException If customer with the specified ID does not exist.
 * @throws \Magento\Framework\Exception\LocalizedException
 */
 public function getById($customerId);


Slide 93

Slide 93 text

JoshuaWarren.com Service Contracts include Data Interfaces and Service Interfaces #ZendCon

Slide 94

Slide 94 text

JoshuaWarren.com Data Interfaces return information about data entities #ZendCon

Slide 95

Slide 95 text

JoshuaWarren.com Service Interfaces handle business logic #ZendCon

Slide 96

Slide 96 text

JoshuaWarren.com Three types of service interfaces in Magento 2 (so far) #ZendCon

Slide 97

Slide 97 text

JoshuaWarren.com Repository Interfaces provide access to persistent data entities #ZendCon

Slide 98

Slide 98 text

JoshuaWarren.com CustomerRepositoryInterface, AddressRepositoryInterface, etc. #ZendCon

Slide 99

Slide 99 text

JoshuaWarren.com Repository interfaces contain the CRUD operations #ZendCon

Slide 100

Slide 100 text

JoshuaWarren.com Management interfaces contain management functions not related to repositories #ZendCon

Slide 101

Slide 101 text

JoshuaWarren.com Validators, createAccount, changePassword, etc #ZendCon

Slide 102

Slide 102 text

JoshuaWarren.com Metadata interfaces provide meta information - primarily about custom attributes #ZendCon

Slide 103

Slide 103 text

JoshuaWarren.com Most service contracts are in the Api folder - but not all. There are SPIs annotated with @Api but in the Model folder, not Api #ZendCon

Slide 104

Slide 104 text

EXTENDING MAGENTO 2

Slide 105

Slide 105 text

JoshuaWarren.com Check out the Magento 2 sample extensions - 12 official samples, including 1 theme #ZendCon

Slide 106

Slide 106 text

JoshuaWarren.com Create your basic module file structure #ZendCon

Slide 107

Slide 107 text

JoshuaWarren.com #ZendCon App/Code/// composer.json etc/module.xml Test/Unit/

Slide 108

Slide 108 text

JoshuaWarren.com #ZendCon Composer.json { "name": "joshuaswarren/sample-module-minimal", "description": "A minimal sample Magento 2 module", "type": "magento2-module", "version": "1.0.0", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { "php": "~5.5.0|~5.6.0", "magento/magento-composer-installer": "*" }, "extra": { "map": [ [ "*", "joshuaswarren/SampleMinimal" ] ] } }

Slide 109

Slide 109 text

JoshuaWarren.com #ZendCon etc/module.xml

Slide 110

Slide 110 text

JoshuaWarren.com #ZendCon NEW! Registration.php As of last week, Magento 2 modules need a registration.php file - this allows modules to live in vendor directory

Slide 111

Slide 111 text

JoshuaWarren.com #ZendCon NEW! Registration.php Thanks to Mage2.Pro for this reusable snippet

Slide 112

Slide 112 text

JoshuaWarren.com Optional config files in etc: acl.xml config.xml di.xml webapi.xml #ZendCon

Slide 113

Slide 113 text

JoshuaWarren.com acl.xml defines new items for Magento’s ACL system #ZendCon

Slide 114

Slide 114 text

JoshuaWarren.com Config.xml adds new configuration options #ZendCon

Slide 115

Slide 115 text

JoshuaWarren.com Webapi.xml defines items to expose via the REST or SOAP APIs #ZendCon

Slide 116

Slide 116 text

JoshuaWarren.com Optional subdirectories in etc: adminhtml frontend webapi_rest webapi_soap #ZendCon

Slide 117

Slide 117 text

JoshuaWarren.com Items in the main etc directory apply globally to your extension #ZendCon

Slide 118

Slide 118 text

JoshuaWarren.com Items in the 4 subdirectories apply only to that area - i.e., adminhtml only applies to the Magento backend #ZendCon

Slide 119

Slide 119 text

JoshuaWarren.com Optional subdirectories: API Block Controller Helper Model #ZendCon

Slide 120

Slide 120 text

JoshuaWarren.com Optional subdirectories: Plugin Setup Ui i18n view #ZendCon

Slide 121

Slide 121 text

JoshuaWarren.com API contains any new service contracts your extension adds #ZendCon

Slide 122

Slide 122 text

JoshuaWarren.com Plugin contains any interceptors your extension defines #ZendCon

Slide 123

Slide 123 text

JoshuaWarren.com UI is for Magento 2’s new Magento UI library #ZendCon

Slide 124

Slide 124 text

JoshuaWarren.com I18n contains internationalization files - CSV files defining the translations for your strings #ZendCon

Slide 125

Slide 125 text

JoshuaWarren.com If your extension doesn’t need one of these items, just omit that folder #ZendCon

Slide 126

Slide 126 text

JoshuaWarren.com Sample: custom shipping method to allow for in-store pickup from several locations #ZendCon

Slide 127

Slide 127 text

JoshuaWarren.com #ZendCon Block/System/Config/Form/Field/Locations.php namespace Magento\SampleShippingProvider\Block\System\Config\Form\Field;
 use Magento\Config\Block\System\Config\Form\Field\FieldArray\AbstractFieldArray;
 /**
 * Backend system config array field renderer
 */
 class Locations extends AbstractFieldArray
 {
 /**
 * Initialise columns for 'Store Locations'
 *
 * @return void
 */
 protected function _construct()
 {
 $this->addColumn('title',
 ['label' => __('Title'), 'class' => 'validate-no-empty validate-alphanum-with-spaces']);
 $this->addColumn('street',
 ['label' => __('Street Address'), 'class' => 'validate-no-empty validate-alphanum-with-spaces']);
 $this->addColumn('phone',
 ['label' => __('Phone Number'), 'class' => 'validate-no-empty validate-no-empty validate-phoneStrict']);
 $this->addColumn('message',
 ['label' => __('Message'), 'class' => 'validate-no-empty']);
 $this->_addAfter = false;
 parent::_construct();
 }
 }

Slide 128

Slide 128 text

JoshuaWarren.com #ZendCon Model/Type/Plugin/Onepage.php [1/2] namespace Magento\SampleShippingProvider\Model\Type\Plugin;
 use Magento\Checkout\Model\Type\Onepage as CheckoutOnePage;
 use Magento\SampleShippingProvider\Model\Carrier;
 /**
 * Change Shipping Address to selected Store location address
 */
 class Onepage
 {
 /**
 * @var Carrier
 */
 private $carrier;
 /**
 * @param Carrier $carrier
 */
 public function __construct(Carrier $carrier)
 {
 $this->carrier = $carrier;
 }


Slide 129

Slide 129 text

JoshuaWarren.com #ZendCon Model/Type/Plugin/Onepage.php [2/2] /**
 * Replace shipping address with pickup location address
 * @param CheckoutOnePage $subject
 * @param array $result
 * @return $this
 */
 public function afterSaveShippingMethod(CheckoutOnePage $subject, array $result)
 {
 if ($result) {
 return $result;
 }
 $quote = $subject->getQuote();
 $shippingAddress = $quote->getShippingAddress();
 $shippingMethod = $shippingAddress->getShippingMethod();
 /**
 * In-Store pickup selected
 * Update Shipping Address
 */
 if (strpos($shippingMethod, $this->carrier->getCarrierCode()) !== false) {
 $locationAddress = $this->carrier->getLocationInfo($shippingMethod);
 $shippingAddress->setCountryId($locationAddress['country_id']);
 $shippingAddress->setRegionId($locationAddress['region_id']);
 $shippingAddress->setPostcode($locationAddress['postcode']);
 $shippingAddress->setCity($locationAddress['city']);
 $shippingAddress->setStreet($locationAddress['street']);
 $shippingAddress->setTelephone($locationAddress['phone']);
 }
 return $result;
 }
 }

Slide 130

Slide 130 text

JoshuaWarren.com #ZendCon Model/Carrier.php namespace Magento\SampleShippingProvider\Model;
 use Psr\Log\LoggerInterface;
 use Magento\Framework\App\Config\ScopeConfigInterface;
 use Magento\Store\Model\ScopeInterface;
 use Magento\Shipping\Model\Carrier\AbstractCarrier;
 use Magento\Shipping\Model\Carrier\CarrierInterface;
 use Magento\Shipping\Model\Config;
 use Magento\Shipping\Model\Rate\ResultFactory;
 use Magento\Quote\Model\Quote\Address\RateResult\MethodFactory;
 use Magento\Quote\Model\Quote\Address\RateResult\ErrorFactory;
 /**
 * In-Store Pickup shipping model
 */
 class Carrier extends AbstractCarrier implements CarrierInterface
 {
 /**
 * @var string
 */
 protected $_code = 'storepickup';
 /**
 * @var bool
 */
 protected $_isFixed = true; … see https://github.com/magento/magento2-samples/blob/master/sample-module-shipping-provider/Model/Carrier.php 


Slide 131

Slide 131 text

JoshuaWarren.com model/carrier.php contains all of the functions a shipping carrier must have in Magento 2 #ZendCon

Slide 132

Slide 132 text

JoshuaWarren.com GetAllowedMethods CollectRates GetLocationInfo BuildRateForLocation GetLocations GetShippingOrigin #ZendCon

Slide 133

Slide 133 text

JoshuaWarren.com #ZendCon Etc/Adminhtml/System.xml 
 
 
 In-Store Pickup
 
 Enabled
 Magento\Config\Model\Config\Source\Yesno
 
 Warning: Shipping Origin should be configured to use this method.]]>
 
 
 
 Title
 
 […]

Slide 134

Slide 134 text

JoshuaWarren.com #ZendCon Etc/Frontend/di.xml 
 
 
 
 


Slide 135

Slide 135 text

JoshuaWarren.com #ZendCon Etc/Module.xml 
 
 


Slide 136

Slide 136 text

JoshuaWarren.com #ZendCon Composer.json { "name": "magento/sample-module-shipping-provider", "description": "Demonstrate Shipping Provider", "type": "magento2-module", "version": "1.0.0", "license": [ "OSL-3.0", "AFL-3.0" ], "require": { "php": "~5.5.0|~5.6.0", "magento/magento-composer-installer": "*", "magento/framework": "~0.74", "magento/module-store": "~0.74", "magento/module-shipping": "~0.74", "magento/module-quote": "~0.74", "magento/module-checkout": "~0.74" }, "extra": { "map": [ [ "*", "Magento/SampleShippingProvider" ] ] } }

Slide 137

Slide 137 text

JoshuaWarren.com We now have a complete, functioning in-store-pickup shipping extension for Magento 2 #ZendCon

Slide 138

Slide 138 text

JoshuaWarren.com Take a look at the Test/Unit directory on Github for tests for this extension #ZendCon

Slide 139

Slide 139 text

JoshuaWarren.com Magento 2 unit testing includes mocking, fixtures, etc. - everything you need for TDD #ZendCon

Slide 140

Slide 140 text

JoshuaWarren.com Dev Docs includes a great ‘How Do I’ on the Magento Testing Framework and testing in Magento 2 #ZendCon

Slide 141

Slide 141 text

LEARNING MORE Don’t end up like this guy ->

Slide 142

Slide 142 text

JoshuaWarren.com devdocs.magento.com - ‘How Do I?’ magento.stackexchange.com/questions/tagged/magento2 https://github.com/magento/magento2-samples #ZendCon

Slide 143

Slide 143 text

Dev Docs Team of hard-working technical writers (not developers) Writing documentation for a system that has yet to be used ‘in the wild’ Very eager for feedback and input - they don’t know what documentation you need Very open to pull requests of documentation or just open an issue on Github with feedback + requests JoshuaWarren.com #ZendCon

Slide 144

Slide 144 text

JoshuaWarren.com Magento U Courses Fundamentals of Magento 2 Development Front-end Course #ZendCon

Slide 145

Slide 145 text

JoshuaWarren.com AlanStorm.com AlanKent.me CoderOnCode.com github.com/creatuity/LearningMagento2 #ZendCon

Slide 146

Slide 146 text

JoshuaWarren.com Upcoming events: php[world] - November 2015 Magento Imagine - April 2016 #ZendCon

Slide 147

Slide 147 text

JoshuaWarren.com As a freelancer… Learning Magento 2 Set aside time in your week to learn the design patterns Magento 2 uses Work through the sample code the Magento 2 team has provided Begin experimenting with developing with Magento 2 Do not try to learn ‘on the job’ - be careful accepting M2 work before you’re ready #ZendCon

Slide 148

Slide 148 text

JoshuaWarren.com As an in-house developer for a merchant… Learning Magento 2 Determine when your business is likely to migrate to Magento 2 First 2-4 weeks of your Magento 2 migration schedule should be learning Magento 2 Learn the patterns before you start! #ZendCon

Slide 149

Slide 149 text

JoshuaWarren.com As an agency or industry partner… Learning Magento 2 Create a tiger team of developers focused on Magento 2 Allow those developers time in the day to learn Magento 2 Those developers should implement your first Magento 2 projects That team then helps the rest of your team through the learning curve #ZendCon

Slide 150

Slide 150 text

JoshuaWarren.com When do I need to be Magento 2 ready? Learning Magento 2 Magento 2 will be released late enough in the year that most merchants won’t begin using it immediately. Merchants will also wait until their mission-critical extensions are available on Magento 2. Start learning it now - but don’t panic! #ZendCon

Slide 151

Slide 151 text

JoshuaWarren.com Programming With Magento 2 coming to amazon.com & phparch.com #ZendCon

Slide 152

Slide 152 text

Keep in Touch! @JoshuaSWarren JoshuaWarren.com Mage2DevBook.com joind.in/15597

Slide 153

Slide 153 text

JoshuaWarren.com #ZendCon