SlideShare una empresa de Scribd logo
1 de 139
Descargar para leer sin conexión
PRESENTED BY
JOSHUA WARREN
PRESENTED AT
NORTHEAST PHP 2015
Magento 2
AN INTRODUCTION
TO A MODERN PHP-
BASED SYSTEM
MY
EXPERIENCE
JoshuaWarren.com
My Experience
PHP Developer Since 1999
Founded Creatuity in 2008
Focused on the Magento platform
Magento 2 contributor
#NEPHP
JoshuaWarren.com
early adopter of both Magento 1
and Magento 2
#NEPHP
JoshuaWarren.com
Frequent Magento presenter
#NEPHP
JoshuaWarren.com
Active member of the
#RealMagento community
#NEPHP
JoshuaWarren.com
Involved in feedback and design
discussions throughout the
Magento 2 Developer Beta
#NEPHP
JoshuaWarren.com
Wrote Writing the book on
Magento 2
#NEPHP
A BRIEF
HISTORY OF
MAGENTO
Photo courtesy of @YoavKutner
JoshuaWarren.com
Magento 1 development began in
2007 by Varien, a PHP development
agency.
#NEPHP
JoshuaWarren.com
In 2007, osCommerce was state of
the art.
#NEPHP
JoshuaWarren.com
Cloud-based eCommerce systems
didn’t exist.
#NEPHP
JoshuaWarren.com
PHP 5.2 was cutting-edge.
#NEPHP
JoshuaWarren.com
Composer didn’t exist, and Zend
Framework 1 was still in early beta.
#NEPHP
JoshuaWarren.com
Magento 1 was built to resolve the
pain points of osCommerce.
#NEPHP
JoshuaWarren.com
Designed to be more flexible and to
provide standardized ways to
customize the platform.
#NEPHP
JoshuaWarren.com
By 2010, Magento had been
downloaded 1.5 million times.
#NEPHP
JoshuaWarren.com
Attracted by Magento’s free, open-
source approach, hundreds of
thousands of sites were launched
using Magento 1.
#NEPHP
JoshuaWarren.com
There’s just one problem…
#NEPHP
JoshuaWarren.com
Ecommerce development is hard.
#NEPHP
JoshuaWarren.com
Lightly documented ecommerce
development is even harder.
#NEPHP
JoshuaWarren.com
Varien, now known as Magento Inc,
is acquired by eBay in 2011.
#NEPHP
JoshuaWarren.com
Work begins on Magento 2 almost
immediately.
#NEPHP
JoshuaWarren.com
Now the most widely-used
eCommerce platform, powering over
250,000 sites, expectations are high
for the Magento 2 team.
#NEPHP
JoshuaWarren.com
Fewer than 30 commits are made to
Magento 2 in 2012.
#NEPHP
JoshuaWarren.com
Internal priorities continue to shift,
and finally at the end of 2014,
Magento 2 development is made
public on Github.
#NEPHP
JoshuaWarren.com
Magento commits to a release
schedule for Magento 2, and
announces the acceptance of pull
requests.
#NEPHP
JoshuaWarren.com
devdocs.magento.com launches with
significant documentation of
Magento 2.
#NEPHP
JoshuaWarren.com
Developer Beta is released in
December 2014; Merchant Beta in
July 2015
#NEPHP
JoshuaWarren.com
Production-ready release (‘general
availability’) scheduled for Q4 2015
#NEPHP
MAGENTO 2
github.com/magento/magento2
JoshuaWarren.com
Feature parity with Magento 1 +
UI/UX Improvements + focus on
resolving technical debt
#NEPHP
JoshuaWarren.com
Technologies
#NEPHP
JoshuaWarren.com #NEPHP
Composer
composer create-project magento/product-community-edition --stability="beta"
<installation directory name>
JoshuaWarren.com
Each Magento 2 module is a
separate Composer package
#NEPHP
JoshuaWarren.com
PSR-0 thru PSR-4
#NEPHP
JoshuaWarren.com
Testing built in from the start.
phpunit, selenium, JMeter, Jasmine
#NEPHP
JoshuaWarren.com
magento2/dev/tests/
#NEPHP
JoshuaWarren.com
HTML5, CSS3, LESS CSS
Preprocessor, JQuery, RequireJS
#NEPHP
JoshuaWarren.com
Components from Zend
Framework 1, Zend Framework 2,
Symfony
#NEPHP
JoshuaWarren.com
Technical Architecture
#NEPHP
JoshuaWarren.com
Presentation Layer, Service Layer,
Domain Layer, Persistence Layer
#NEPHP
JoshuaWarren.com #NEPHP
JoshuaWarren.com
Presentation Layer - views,
literally and figuratively
#NEPHP
JoshuaWarren.com
Service Layer - an intermediary
between the presentation and
model layers
#NEPHP
JoshuaWarren.com
Service layer provides a stable,
backwards-compatible interface
and forms the foundation for
dependency injection.
#NEPHP
JoshuaWarren.com
Domain layer - business logic,
including models. Contains the
implementation of service
contracts.
#NEPHP
JoshuaWarren.com
Persistence Layer - resource
models that perform CRUD
operations on database tables.
#NEPHP
JoshuaWarren.com
Some models use a single table,
others continue to use the
Entity-Attribute-Value design
pattern used in Magento 1.
#NEPHP
JoshuaWarren.com
Design Patterns
#NEPHP
JoshuaWarren.com
Loose Coupling
#NEPHP
JoshuaWarren.com
Dependency Injection
#NEPHP
JoshuaWarren.com
Service Contracts
#NEPHP
JoshuaWarren.com
Interceptors
#NEPHP
JoshuaWarren.com
Semantic Versioning
#NEPHP
DEPENDENCY
INJECTION
Sorry - no cool photo here, because I don’t like needles…
JoshuaWarren.com
DI is exactly what it sounds like -
injecting dependencies into the
objects that need them.
#NEPHP
JoshuaWarren.com
DI is designed to reduce
dependencies and promote loose
coupling
#NEPHP
JoshuaWarren.com
DI makes unit testing much easier
#NEPHP
JoshuaWarren.com
Magento 2 uses the Constructor
Injection pattern of DI
#NEPHP
JoshuaWarren.com
DI in Magento 2 is handled via XML
files
#NEPHP
JoshuaWarren.com #NEPHP
di.xml
<config xmlns:xsi=“[…]” xsi:noNamespaceSchemaLocation=“[…]”>

<virtualType name="MagentoSamplePaymentProviderBlockFormPayinstore"
type="MagentoPaymentBlockForm" shared="false">
<arguments>

<argument name="data" xsi:type="array">

<item name="template" xsi:type=“string">
Magento_SamplePaymentProvider::form/payinstore.phtml
</item>

</argument>

</arguments>

</virtualType>

</config>
INTERCEPTORS
JoshuaWarren.com
Plugin system based on the
interceptor pattern
#NEPHP
JoshuaWarren.com
Calls to almost any module can
be intercepted and altered
#NEPHP
JoshuaWarren.com
Vast improvement over the
rewrite pattern in Magento 1 - no
more rewrite conflicts
#NEPHP
JoshuaWarren.com #NEPHP
di.xml
<config>

<type name="{ObservedType}">

<plugin name="{pluginName}" type="{PluginClassName}" sortOrder="1" disabled="false"/>

</type>

</config>
JoshuaWarren.com
Sort order defines order if
multiple plugins intercept the
same item
#NEPHP
JoshuaWarren.com
Possible to intercept before,
after and around a function
#NEPHP
JoshuaWarren.com #NEPHP
‘Before’ Interceptor
class Plugin

{

public function beforeSetName(MagentoCatalogModelProduct $subject, $name)

{

return array('(' . $name . ')');

}

}
JoshuaWarren.com #NEPHP
‘After’ Interceptor
class Plugin

{

public function afterGetName(MagentoCatalogModelProduct $subject, $result)

{

return '|' . $result . '|';

}

}
JoshuaWarren.com #NEPHP
‘Around’ Interceptor
class Plugin

{

public function aroundSave(MagentoCatalogModelProduct $subject, Closure $proceed)

{

$this->doSomethingBeforeProductIsSaved();

$returnValue = $proceed();

if ($returnValue) {

$this->postProductToFacebook();

}

return $returnValue;

}

}
SERVICE
CONTRACTS
Credit to Allan MacGregor for the Soylent Green joke.
JoshuaWarren.com
Set of interfaces to define the public
API of a module
#NEPHP
JoshuaWarren.com
This API is the interface provided to
other modules to access its
implementation
#NEPHP
JoshuaWarren.com
Designed to hide business logic
behind a stable interface
#NEPHP
JoshuaWarren.com
Service contracts + semantic
versioning = minor releases will not
break existing code
#NEPHP
JoshuaWarren.com
@deprecated = will be removed
with the next major version release
#NEPHP
JoshuaWarren.com #NEPHP
CustomerRepositoryInterface.php


namespace MagentoCustomerApi;

/**

* Customer CRUD interface.

*/

interface CustomerRepositoryInterface

{

/**

* Create customer.

*

* @api

* @param MagentoCustomerApiDataCustomerInterface $customer

* @param string $passwordHash

* @return MagentoCustomerApiDataCustomerInterface

* @throws MagentoFrameworkExceptionInputException If bad input is provided

* @throws MagentoFrameworkExceptionStateInputMismatchException If the provided email is already used

* @throws MagentoFrameworkExceptionLocalizedException

*/

public function save(MagentoCustomerApiDataCustomerInterface $customer, $passwordHash = null);
JoshuaWarren.com #NEPHP
CustomerRepositoryInterface.php
/**

* Retrieve customer.

*

* @api

* @param string $email

* @param int|null $websiteId

* @return MagentoCustomerApiDataCustomerInterface

* @throws MagentoFrameworkExceptionNoSuchEntityException If customer with the specified email does not exist.

* @throws MagentoFrameworkExceptionLocalizedException

*/

public function get($email, $websiteId = null);

/**

* Retrieve customer.

*

* @api

* @param int $customerId

* @return MagentoCustomerApiDataCustomerInterface

* @throws MagentoFrameworkExceptionNoSuchEntityException If customer with the specified ID does not exist.

* @throws MagentoFrameworkExceptionLocalizedException

*/

public function getById($customerId);

JoshuaWarren.com
Service Contracts include Data
Interfaces and Service Interfaces
#NEPHP
JoshuaWarren.com
Data Interfaces return information
about data entities
#NEPHP
JoshuaWarren.com
Service Interfaces handle business
logic
#NEPHP
JoshuaWarren.com
Three types of service interfaces in
Magento 2 (so far)
#NEPHP
JoshuaWarren.com
Repository Interfaces provide access
to persistent data entities
#NEPHP
JoshuaWarren.com
CustomerRepositoryInterface,
AddressRepositoryInterface, etc.
#NEPHP
JoshuaWarren.com
Repository interfaces contain the
CRUD operations
#NEPHP
JoshuaWarren.com
Management interfaces contain
management functions not related
to repositories
#NEPHP
JoshuaWarren.com
Validators, createAccount,
changePassword, etc
#NEPHP
JoshuaWarren.com
Metadata interfaces provide meta
information - primarily about
custom attributes
#NEPHP
EXTENDING
MAGENTO 2
JoshuaWarren.com
Create your basic module file
structure
#NEPHP
JoshuaWarren.com #NEPHP
App/Code/<Vendor>/<Module>/
composer.json
etc/module.xml
Test/Unit/<tests go here>
JoshuaWarren.com #NEPHP
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"
]
]
}
}
JoshuaWarren.com #NEPHP
etc/module.xml
<config>
<module name=“Joshuaswarren_SampleMinimal" setup_version="2.0.0">
</module>
</config>
JoshuaWarren.com
Optional config files in etc:
acl.xml
config.xml
di.xml
webapi.xml
#NEPHP
JoshuaWarren.com
acl.xml defines new items for
Magento’s ACL system
#NEPHP
JoshuaWarren.com
Config.xml adds new
configuration options
#NEPHP
JoshuaWarren.com
Webapi.xml defines items to
expose via the REST or SOAP APIs
#NEPHP
JoshuaWarren.com
Optional subdirectories in etc:
adminhtml
frontend
webapi_rest
webapi_soap
#NEPHP
JoshuaWarren.com
Items in the main etc directory
apply globally to your extension
#NEPHP
JoshuaWarren.com
Items in the 4 subdirectories apply
only to that area - i.e., adminhtml
only applies to the Magento
backend
#NEPHP
JoshuaWarren.com
Optional subdirectories:
API
Block
Controller
Helper
Model
#NEPHP
JoshuaWarren.com
Optional subdirectories:
Plugin
Setup
Ui
i18n
view
#NEPHP
JoshuaWarren.com
API contains any new service
contracts your extension adds
#NEPHP
JoshuaWarren.com
Block contains any new template
blocks your extension adds
#NEPHP
JoshuaWarren.com
Controller contains your
extension’s controllers
#NEPHP
JoshuaWarren.com
Helper contains any helper
functions that your extension
needs
#NEPHP
JoshuaWarren.com
Model contains your extension’s
models
#NEPHP
JoshuaWarren.com
Plugin contains any interceptors
your extension defines
#NEPHP
JoshuaWarren.com
Setup contains your database
migrations using Magento’s setup
script system
#NEPHP
JoshuaWarren.com
UI is for Magento 2’s new Magento
UI library
#NEPHP
JoshuaWarren.com
I18n contains internationalization
files - CSV files defining the
translations for your strings
#NEPHP
JoshuaWarren.com
View contains the views for your
extension
#NEPHP
JoshuaWarren.com
If your extension doesn’t need
one of these items, just omit that
folder
#NEPHP
JoshuaWarren.com
Sample: custom shipping method
to allow for in-store pickup from
several locations
#NEPHP
JoshuaWarren.com #NEPHP
Block/System/Config/Form/Field/Locations.php
namespace MagentoSampleShippingProviderBlockSystemConfigFormField;

use MagentoConfigBlockSystemConfigFormFieldFieldArrayAbstractFieldArray;

/**

* 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();

}

}
JoshuaWarren.com #NEPHP
Model/Type/Plugin/Onepage.php [1/2]
namespace MagentoSampleShippingProviderModelTypePlugin;

use MagentoCheckoutModelTypeOnepage as CheckoutOnePage;

use MagentoSampleShippingProviderModelCarrier;

/**

* 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;

}

JoshuaWarren.com #NEPHP
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;

}

}
JoshuaWarren.com #NEPHP
Model/Carrier.php
namespace MagentoSampleShippingProviderModel;

use PsrLogLoggerInterface;

use MagentoFrameworkAppConfigScopeConfigInterface;

use MagentoStoreModelScopeInterface;

use MagentoShippingModelCarrierAbstractCarrier;

use MagentoShippingModelCarrierCarrierInterface;

use MagentoShippingModelConfig;

use MagentoShippingModelRateResultFactory;

use MagentoQuoteModelQuoteAddressRateResultMethodFactory;

use MagentoQuoteModelQuoteAddressRateResultErrorFactory;

/**

* 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 

JoshuaWarren.com
In model/carrier.php we implement
all of the functions a shipping
carrier must have in Magento 2
#NEPHP
JoshuaWarren.com
GetAllowedMethods
CollectRates
GetLocationInfo
BuildRateForLocation
GetLocations
GetShippingOrigin
#NEPHP
JoshuaWarren.com #NEPHP
Etc/Adminhtml/System.xml
<system>

<section id="carriers">

<group id="storepickup" translate="label" type="text" sortOrder="10" showInDefault="1" showInWebsite="1" showInStore="1">

<label>In-Store Pickup</label>

<field id="active" translate="label" type="select" sortOrder="1" showInDefault="1" showInWebsite="1" showInStore="1">

<label>Enabled</label>

<source_model>MagentoConfigModelConfigSourceYesno</source_model>

<comment>

<![CDATA[<strong style="color:red">Warning</strong>: Shipping Origin should be configured to use this method.]]>

</comment>

</field>

<field id="title" translate="label" type="text" sortOrder="2" showInDefault="1" showInWebsite="1" showInStore="1">

<label>Title</label>

</field>

[…]
JoshuaWarren.com #NEPHP
Etc/Frontend/di.xml
<config xmlns:xsi=“[…]” xsi:noNamespaceSchemaLocation=“[…]”>

<type name="MagentoSampleShippingProviderModelTypePluginOnepage"/>

<type name="MagentoCheckoutModelTypeOnepage">

<plugin name="change_shipping_address" type="MagentoSampleShippingProviderModelTypePluginOnepage"/>

</type>

</config>
JoshuaWarren.com #NEPHP
Etc/Config.xml
<config xmlns:xsi=“[…]” xsi:noNamespaceSchemaLocation=“[…]”>

<default>

<carriers>

<storepickup>

<active>1</active>

<model>MagentoSampleShippingProviderModelCarrier</model>

<title>In-Store Pickup</title>

<specificerrmsg>This shipping method is not available.</specificerrmsg>

</storepickup>

</carriers>

</default>

</config>
JoshuaWarren.com #NEPHP
Etc/Module.xml
<config xmlns:xsi=“[…]” xsi:noNamespaceSchemaLocation=“[…]”>

<module name="Magento_SampleShippingProvider" setup_version="2.0.0">

</module>

</config>
JoshuaWarren.com #NEPHP
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"
]
]
}
}
JoshuaWarren.com
We now have a complete,
functioning in-store-pickup
shipping extension for Magento 2
#NEPHP
JoshuaWarren.com
Take a look at the Test/Unit
directory on Github for tests for
this extension
#NEPHP
JoshuaWarren.com
Magento 2 unit testing includes
mocking, fixtures, etc. -
everything you need for TDD
#NEPHP
LEARNING
MORE
Don’t end up like this guy ->
JoshuaWarren.com
devdocs.magento.com
magento.stackexchange.com/questions/tagged/magento2
#NEPHP
JoshuaWarren.com
AlanStorm.com
AlanKent.me
CoderOnCode.com
#NEPHP
JoshuaWarren.com
Upcoming events: Meet Magento
New York, ZendCon, php[world]
#NEPHP
JoshuaWarren.com
Programming With Magento 2 coming to
amazon.com & phparch.com
#NEPHP
Keep in
Touch!
joind.in/14737
@JoshuaSWarren
JoshuaWarren.com
Mage2DevBook.com
JoshuaWarren.com #NEPHP

Más contenido relacionado

La actualidad más candente

La actualidad más candente (20)

Magento 2 Modules are Easy!
Magento 2 Modules are Easy!Magento 2 Modules are Easy!
Magento 2 Modules are Easy!
 
Magento 2 overview. Alan Kent
Magento 2 overview. Alan Kent Magento 2 overview. Alan Kent
Magento 2 overview. Alan Kent
 
Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015
Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015
Magento 2 - An Intro to a Modern PHP-Based System - ZendCon 2015
 
MidwestPHP - Getting Started with Magento 2
MidwestPHP - Getting Started with Magento 2MidwestPHP - Getting Started with Magento 2
MidwestPHP - Getting Started with Magento 2
 
Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015
Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015
Magento 2 Dependency Injection, Interceptors, and You - php[world] 2015
 
How to create theme in Magento 2 - Part 2
How to create theme in Magento 2 - Part 2How to create theme in Magento 2 - Part 2
How to create theme in Magento 2 - Part 2
 
Magento 2: Modernizing an eCommerce Powerhouse
Magento 2: Modernizing an eCommerce PowerhouseMagento 2: Modernizing an eCommerce Powerhouse
Magento 2: Modernizing an eCommerce Powerhouse
 
12 Amazing Features of Magento 2
12 Amazing Features of Magento 212 Amazing Features of Magento 2
12 Amazing Features of Magento 2
 
Sergii Shymko - Code migration tool for upgrade to Magento 2
Sergii Shymko - Code migration tool for upgrade to Magento 2Sergii Shymko - Code migration tool for upgrade to Magento 2
Sergii Shymko - Code migration tool for upgrade to Magento 2
 
Magento 2 Development
Magento 2 DevelopmentMagento 2 Development
Magento 2 Development
 
Max Yekaterynenko: Magento 2 overview
Max Yekaterynenko: Magento 2 overviewMax Yekaterynenko: Magento 2 overview
Max Yekaterynenko: Magento 2 overview
 
Magento 2 Seminar - Daniel Genis - Magento 2 benchmarks
Magento 2 Seminar - Daniel Genis - Magento 2 benchmarksMagento 2 Seminar - Daniel Genis - Magento 2 benchmarks
Magento 2 Seminar - Daniel Genis - Magento 2 benchmarks
 
The journey of mastering Magento 2 for Magento 1 developers
The journey of mastering Magento 2 for Magento 1 developersThe journey of mastering Magento 2 for Magento 1 developers
The journey of mastering Magento 2 for Magento 1 developers
 
Madison PHP - Getting Started with Magento 2
Madison PHP - Getting Started with Magento 2Madison PHP - Getting Started with Magento 2
Madison PHP - Getting Started with Magento 2
 
Outlook on Magento 2
Outlook on Magento 2Outlook on Magento 2
Outlook on Magento 2
 
How I Learned to Stop Worrying and Love Composer - php[world] 2015
How I Learned to Stop Worrying and Love Composer - php[world] 2015How I Learned to Stop Worrying and Love Composer - php[world] 2015
How I Learned to Stop Worrying and Love Composer - php[world] 2015
 
Magento 2 Development Best Practices
Magento 2 Development Best PracticesMagento 2 Development Best Practices
Magento 2 Development Best Practices
 
How to Install Magento 2 [Latest Version]
How to Install Magento 2 [Latest Version]How to Install Magento 2 [Latest Version]
How to Install Magento 2 [Latest Version]
 
How to Install Magento 2 on XAMPP Server localhost.
How to Install Magento 2 on XAMPP Server localhost.How to Install Magento 2 on XAMPP Server localhost.
How to Install Magento 2 on XAMPP Server localhost.
 
Max Yekaterinenko - Magento 2 & Quality
Max Yekaterinenko - Magento 2 & QualityMax Yekaterinenko - Magento 2 & Quality
Max Yekaterinenko - Magento 2 & Quality
 

Similar a Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015

Zepplin_Pronko_Magento_Festival Hall 1_Final
Zepplin_Pronko_Magento_Festival Hall 1_FinalZepplin_Pronko_Magento_Festival Hall 1_Final
Zepplin_Pronko_Magento_Festival Hall 1_Final
Max Pronko
 
symfony: Simplify your professional web development with PHP (IPC Frankfurt 2...
symfony: Simplify your professional web development with PHP (IPC Frankfurt 2...symfony: Simplify your professional web development with PHP (IPC Frankfurt 2...
symfony: Simplify your professional web development with PHP (IPC Frankfurt 2...
Fabien Potencier
 

Similar a Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015 (20)

Zepplin_Pronko_Magento_Festival Hall 1_Final
Zepplin_Pronko_Magento_Festival Hall 1_FinalZepplin_Pronko_Magento_Festival Hall 1_Final
Zepplin_Pronko_Magento_Festival Hall 1_Final
 
High Stakes Continuous Delivery in the Real World #OpenWest
High Stakes Continuous Delivery in the Real World #OpenWestHigh Stakes Continuous Delivery in the Real World #OpenWest
High Stakes Continuous Delivery in the Real World #OpenWest
 
Advanced deployment scenarios (netcoreconf)
Advanced deployment scenarios (netcoreconf)Advanced deployment scenarios (netcoreconf)
Advanced deployment scenarios (netcoreconf)
 
symfony: Simplify your professional web development with PHP (IPC Frankfurt 2...
symfony: Simplify your professional web development with PHP (IPC Frankfurt 2...symfony: Simplify your professional web development with PHP (IPC Frankfurt 2...
symfony: Simplify your professional web development with PHP (IPC Frankfurt 2...
 
Magento 2 development
Magento 2 developmentMagento 2 development
Magento 2 development
 
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
Magento NodeJS Microservices — Yegor Shytikov | Magento Meetup Online #11
 
Vue Storefront MUG
Vue Storefront MUGVue Storefront MUG
Vue Storefront MUG
 
Modern Web Application Development Workflow - EclipseCon US 2014
Modern Web Application Development Workflow - EclipseCon US 2014Modern Web Application Development Workflow - EclipseCon US 2014
Modern Web Application Development Workflow - EclipseCon US 2014
 
Laravel, il framework php per gli artigiani del web
Laravel, il framework php per gli artigiani del webLaravel, il framework php per gli artigiani del web
Laravel, il framework php per gli artigiani del web
 
5 年後還是新手 - WordPress Plugin 開發大冒險 - GOTY
5 年後還是新手 - WordPress Plugin 開發大冒險 - GOTY5 年後還是新手 - WordPress Plugin 開發大冒險 - GOTY
5 年後還是新手 - WordPress Plugin 開發大冒險 - GOTY
 
NDC 2011 - Let me introduce my Moncai
NDC 2011 - Let me introduce my MoncaiNDC 2011 - Let me introduce my Moncai
NDC 2011 - Let me introduce my Moncai
 
Maven 3: New Features - OPITZ CONSULTING - Stefan Scheidt
Maven 3: New Features - OPITZ CONSULTING - Stefan ScheidtMaven 3: New Features - OPITZ CONSULTING - Stefan Scheidt
Maven 3: New Features - OPITZ CONSULTING - Stefan Scheidt
 
LOG4J VULNERABILITY SAP BUSINESS ONE IMPACT AND WORK AROUNDS
LOG4J VULNERABILITY SAP BUSINESS ONE IMPACT AND WORK AROUNDSLOG4J VULNERABILITY SAP BUSINESS ONE IMPACT AND WORK AROUNDS
LOG4J VULNERABILITY SAP BUSINESS ONE IMPACT AND WORK AROUNDS
 
Lightning branches at RedMart (Js conf Asia 2014 Talk)
Lightning branches at RedMart (Js conf Asia 2014  Talk)Lightning branches at RedMart (Js conf Asia 2014  Talk)
Lightning branches at RedMart (Js conf Asia 2014 Talk)
 
Orkhan Gasimov "Reactive & Distributed - Modern JavaScript"
Orkhan Gasimov "Reactive & Distributed - Modern JavaScript"Orkhan Gasimov "Reactive & Distributed - Modern JavaScript"
Orkhan Gasimov "Reactive & Distributed - Modern JavaScript"
 
TDC2017 | São Paulo - Trilha Cloud Computing How we figured out we had a SRE ...
TDC2017 | São Paulo - Trilha Cloud Computing How we figured out we had a SRE ...TDC2017 | São Paulo - Trilha Cloud Computing How we figured out we had a SRE ...
TDC2017 | São Paulo - Trilha Cloud Computing How we figured out we had a SRE ...
 
Introduction To Domain Driven Design
Introduction To Domain Driven DesignIntroduction To Domain Driven Design
Introduction To Domain Driven Design
 
Flutter for web
Flutter for webFlutter for web
Flutter for web
 
JavaOne 2016: Kubernetes introduction for Java Developers
JavaOne 2016: Kubernetes introduction for Java Developers JavaOne 2016: Kubernetes introduction for Java Developers
JavaOne 2016: Kubernetes introduction for Java Developers
 
Kubernetes for Java Developers
 Kubernetes for Java Developers Kubernetes for Java Developers
Kubernetes for Java Developers
 

Más de Joshua Warren

Behavior & Specification Driven Development in PHP - #OpenWest
Behavior & Specification Driven Development in PHP - #OpenWestBehavior & Specification Driven Development in PHP - #OpenWest
Behavior & Specification Driven Development in PHP - #OpenWest
Joshua Warren
 

Más de Joshua Warren (20)

Enhancing the Customer Experience with Chatbots
Enhancing the Customer Experience with ChatbotsEnhancing the Customer Experience with Chatbots
Enhancing the Customer Experience with Chatbots
 
Transforming the Customer Experience Across 100 Stores with Magento
Transforming the Customer Experience Across 100 Stores with MagentoTransforming the Customer Experience Across 100 Stores with Magento
Transforming the Customer Experience Across 100 Stores with Magento
 
Its Just Commerce - IRCE 2018
Its Just Commerce - IRCE 2018Its Just Commerce - IRCE 2018
Its Just Commerce - IRCE 2018
 
Rural King Case Study from the Omnichannel Retail Summit
Rural King Case Study from the Omnichannel Retail SummitRural King Case Study from the Omnichannel Retail Summit
Rural King Case Study from the Omnichannel Retail Summit
 
Avoiding Commerce Extinction: Lessons from Retail Dinosaurs
Avoiding Commerce Extinction: Lessons from Retail DinosaursAvoiding Commerce Extinction: Lessons from Retail Dinosaurs
Avoiding Commerce Extinction: Lessons from Retail Dinosaurs
 
Building a Global B2B Empire: Using Magento to Power International Expansion
Building a Global B2B Empire: Using Magento to Power International ExpansionBuilding a Global B2B Empire: Using Magento to Power International Expansion
Building a Global B2B Empire: Using Magento to Power International Expansion
 
Magento 2 ERP Integration Best Practices: Microsoft Dynamics
Magento 2 ERP Integration Best Practices: Microsoft DynamicsMagento 2 ERP Integration Best Practices: Microsoft Dynamics
Magento 2 ERP Integration Best Practices: Microsoft Dynamics
 
What's New With Magento 2?
What's New With Magento 2?What's New With Magento 2?
What's New With Magento 2?
 
Magento 2 Performance: Every Second Counts
Magento 2 Performance: Every Second CountsMagento 2 Performance: Every Second Counts
Magento 2 Performance: Every Second Counts
 
Pay No Attention to the Project Manager Behind the Curtain: A Magento 2 Tell-All
Pay No Attention to the Project Manager Behind the Curtain: A Magento 2 Tell-AllPay No Attention to the Project Manager Behind the Curtain: A Magento 2 Tell-All
Pay No Attention to the Project Manager Behind the Curtain: A Magento 2 Tell-All
 
Magento 2 Integrations: ERPs, APIs, Webhooks & Rabbits! - MageTitansUSA 2016
Magento 2 Integrations: ERPs, APIs, Webhooks & Rabbits! - MageTitansUSA 2016Magento 2 Integrations: ERPs, APIs, Webhooks & Rabbits! - MageTitansUSA 2016
Magento 2 Integrations: ERPs, APIs, Webhooks & Rabbits! - MageTitansUSA 2016
 
Work Life Balance for Passionate Developers - Full Stack Toronto 2015 Edition
Work Life Balance for Passionate Developers - Full Stack Toronto 2015 EditionWork Life Balance for Passionate Developers - Full Stack Toronto 2015 Edition
Work Life Balance for Passionate Developers - Full Stack Toronto 2015 Edition
 
pnwphp - PHPSpec & Behat: Two Testing Tools That Write Code For You
pnwphp - PHPSpec & Behat: Two Testing Tools That Write Code For Youpnwphp - PHPSpec & Behat: Two Testing Tools That Write Code For You
pnwphp - PHPSpec & Behat: Two Testing Tools That Write Code For You
 
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
PHPSpec & Behat: Two Testing Tools That Write Code For You (#phptek edition)
 
Behavior & Specification Driven Development in PHP - #OpenWest
Behavior & Specification Driven Development in PHP - #OpenWestBehavior & Specification Driven Development in PHP - #OpenWest
Behavior & Specification Driven Development in PHP - #OpenWest
 
Get Out of the Back Row! A Community Involvement Primer - #OpenWest
Get Out of the Back Row! A Community Involvement Primer - #OpenWestGet Out of the Back Row! A Community Involvement Primer - #OpenWest
Get Out of the Back Row! A Community Involvement Primer - #OpenWest
 
Work-Life Balance For Passionate Geeks - #OpenWest
Work-Life Balance For Passionate Geeks - #OpenWestWork-Life Balance For Passionate Geeks - #OpenWest
Work-Life Balance For Passionate Geeks - #OpenWest
 
The Care and Feeding of Magento Developers
The Care and Feeding of Magento DevelopersThe Care and Feeding of Magento Developers
The Care and Feeding of Magento Developers
 
Magento, Client, Budget, Test Driven Development - What You Can, Can’t And Mu...
Magento, Client, Budget, Test Driven Development - What You Can, Can’t And Mu...Magento, Client, Budget, Test Driven Development - What You Can, Can’t And Mu...
Magento, Client, Budget, Test Driven Development - What You Can, Can’t And Mu...
 
A Successful Magento Project From Design to Deployment
A Successful Magento Project From Design to DeploymentA Successful Magento Project From Design to Deployment
A Successful Magento Project From Design to Deployment
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
panagenda
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Safe Software
 

Último (20)

TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?A Year of the Servo Reboot: Where Are We Now?
A Year of the Servo Reboot: Where Are We Now?
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
Why Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire businessWhy Teams call analytics are critical to your entire business
Why Teams call analytics are critical to your entire business
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 
Boost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdfBoost Fertility New Invention Ups Success Rates.pdf
Boost Fertility New Invention Ups Success Rates.pdf
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

Magento 2 - An Intro to a Modern PHP-Based System - Northeast PHP 2015