Date post: | 16-Apr-2017 |
Category: |
Software |
Upload: | joshua-warren |
View: | 232 times |
Download: | 6 times |
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": { "Magento\\SampleMinimal\\": "" } } }
@JoshuaSWarren #phpworld
registration.php
<?php \Magento\Framework\Component\ComponentRegistrar::register( \Magento\Framework\Component\ComponentRegistrar::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="Magento\Framework\Console\CommandList"> <arguments> <argument name="commands" xsi:type="array"> <item name="write_yaml_command" xsi:type=“object">
Creatuity\BlackfireCommands\Console\Command\WriteYamlCommand </item>
<item name=“profile_category_command" xsi:type=“object"> Creatuity\BlackfireCommands\Console\Command\ProfileCategoryCommand </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!