Immersion in the Sylius

Immersion in the Sylius

Slides from my first talk ever, presented at Symfony CAMP UA 2013.

7ae8ff67c92e2087f2e84884449d6da6?s=128

Pawel Jedrzejewski

October 26, 2013
Tweet

Transcript

  1. Immersion in the Sylius Paweł Jędrzejewski

  2. Who am I? Paweł Jędrzejewski Huge beliver in Open Source

    Symfony & BDD evangelist Creator of Sylius Working for Opensoft on
  3. ŁÓDŹ, POLAND

  4. ?

  5. THE PROBLEM PHP has changed This change created the market

    for a new e-commerce solution among developers With the flexibility of modern frameworks and the new way of collaboration we can build something interesting for the business Sylius reflects this evolution
  6. None
  7. WHAT IS SYLIUS A short history Open sourced in 2011

    as a set of bundles Main application in development for ~9 months Already used in production by developers and companies
  8. FLEXIBILITY QUALITY PEOPLE

  9. None
  10. None
  11. FLEXIBILITY QUALITY PEOPLE

  12. QUALITY Behat and phpspec, perfect combination Most of new features

    start with an RFC issue Discussion about the idea and eventual implementation Behat features Implementation
  13. None
  14. None
  15. None
  16. None
  17. FLEXIBILITY QUALITY PEOPLE

  18. BUNDLES vs. MAIN APPLICATION Set of 19 decoupled and independent

    bundles Can be used to create a custom platform Integrate e-commerce into existing application Standard webshop experience Highly customizable Easy to understand for every Symfony2 developer
  19. Sylius Bundles What they can do for you? EVERY SINGLE

    SYLIUS FEATURE AVAILABLE FOR YOUR PROJECt
  20. Simpler CRUD for symfony SyliusResourceBundle Removing tons of duplicated code

    in controllers for basic CRUD actions. Removing the manager and manipulator classes, relying on Doctrine instead. Removing the "frontend" and "backend" controllers. Supporting different persistence layers. Make the controllers format agnostic. (API)
  21. ADD YOUR RESOURCE sylius_resource: resources: acme.user: driver: doctrine/orm templates: AcmeShopBundle:User

    classes: model: Acme\ShopBundle\Entity\User repository: Acme\ShopBundle\Entity\UserRepository controller: Acme\ShopBundle\Controller\UserController
  22. acme.controller.user showAction indexAction createAction updateAction deleteAction

  23. acme_user_show: pattern: /users/{id} methods: [GET] defaults: _controller: acme.controller.user:showAction acme_profile_show: pattern:

    /profile/{username} methods: [GET] defaults: _controller: acme.controller.user:showAction _sylius: template: AcmeShopBundle:Profile:show.html.twig criteria: { username: $username, enabled: true }
  24. acme_profile_show: pattern: /profile/{username} methods: [GET] defaults: _controller: acme.controller.user:showAction _sylius: template:

    AcmeShopBundle:Profile:show.html.twig method: findOneForProfilePage arguments: [$username] acme_user_disabled_index: pattern: /users/disabled methods: [GET] defaults: _controller: acme.controller.user:indexAction _sylius: template: AcmeShopBundle:User:disabled.html.twig criteria: { enabled: false }
  25. acme_user_recently_registered: pattern: /users/recently-registered methods: [GET] defaults: _controller: acme.controller.user:indexAction _sylius: template:

    AcmeShopBundle:User:recentlyRegistered.html.twig criteria: { enabled: true } sorting: { createdAt: desc } paginate: false limit: 5
  26. acme_user_update_addresses: pattern: /users/{id}/update-addresses methods: [GET] defaults: _controller: acme.controller.user:updateAction _sylius: template:

    AcmeShopBundle:User:updateAddresses.html.twig form: acme_user_addresses redirect: route: acme_user_index
  27. Docs.sylius.org

  28. CONFIGURATION sylius_taxation: driver: doctrine/orm classes: tax_rate: model: Acme\ShopBundle\Entity\TaxRate controller: Acme\ShopBundle\Controller\TaxRateController

    repository: Acme\ShopBundle\Entity\TaxRateRepository form: Acme\ShopBundle\Form\Type\TaxRateType validation_groups: tax_rate: [sylius, acme]
  29. USING CUSTOM MODELS and FORMS Every model class can be

    overridden All repositories, managers and forms are updated automatically Form class can be customized
  30. OVERRIDING CONTROLLERS All models use default or slightly customized CRUD

    controller Add your own methods
  31. YOUR OWN REPOSITORY Sylius repositories extend native Doctrine implementations Override

    the repositories through configuration Repositories are services
  32. CHANGE THE RULES, VALIDATION All Sylius models ship with their

    own validation mapping under group „sylius” You can easily override it with your own rules Consistent translation messages
  33. DOCTRINE RTEL, DYNAMIC RELATIONS We're using interfaces instead of implementation

    to define the relations When you override the model class, all relations get updated automatically Defaults are turned into entities if you don't provide your own class
  34. WE LOVE EVENTS, YOU SHOULD TOO The default controller triggers

    multiple useful events during CRUD actions sylius.product.pre_create sylius.product.post_create
  35. PRODUCTS SyliusProductBundle

  36. None
  37. ORDERS AND CART SyliusOrderBundle + SyliusCartBundle Generic Order model with

    support of Adjustments Cart bundle provides actions and services for customer to interact with the Order entity The order/cart items can be easily customized to handle different options
  38. None
  39. COUNTRIES, ZONES AND ADDRESSES SyliusAddressingBundle Provides a very basic Address

    model Countries and their Provinces management Zones system with a ZoneMatcher service Useful for taxation and shipping zones
  40. $billingAddress = $order->getBillingAddress(); $zone = $this->zoneMatcher->match($billingAddress); $address = $location->getAddress(); $zones

    = $this->zoneMatcher->matchAll($address);
  41. TAKE CARE OF YOUR INVENTORY SyliusInventoryBundle Built around 1 interface

    you need to implement Tracks every single inventory unit Based on events Items available on demand Backorders
  42. HATE IT OR LOVE IT, TAXATION SyliusTaxationBundle TaxableInterface = heart

    of the bundle Multiple tax categories and rates support Customizable tax calculators Tax included in price
  43. MERCHANDISE NEEDS TO BE SHIPPED SyliusShippingBundle Integrate through one interface

    Manage Shipments and Shipping Methods Custom shipping rules Flexible calculators system
  44. class PerItemRateCalculator extends Calculator { public function calculate(ShippingSubjectInterface $subject, array

    $configuration) { return $configuration['amount'] * $subject->getShippingItemCount(); } public function getConfigurationFormType() { return 'sylius_shipping_calculator_per_item_rate_configuration'; } public function setConfiguration(OptionsResolverInterface $resolver) { $resolver ->setRequired(array( 'amount')) ->setAllowedTypes(array('amount' => array('numeric'))) ; } }
  45. None
  46. CATEGORIZE ALL THIS STUFF, NOW SyliusTaxonomiesBundle Classify any Model using

    different Taxonomies Flexible forms Based on DoctrineExtensions
  47. None
  48. JUST FEW STEPS MORE SyliusFlowBundle Useful for anything which takes

    more than 1 action to complete Checkouts, installation wizards, complex actions Used by OroCRM and Akeneo PIM for installers
  49. PROCESS SCENARIO <?php class CheckoutProcessScenario implements ProcessScenarioInterface { public function

    build(ProcessBuilderInterface $builder) { $builder ->add('security', 'sylius_checkout_security') ->add('addressing', 'sylius_checkout_addressing') ->add('shipping', 'sylius_checkout_shipping') ->add('payment', 'sylius_checkout_payment') ->add('finalize', 'sylius_checkout_finalize') ->add('purchase', 'sylius_checkout_purchase') ; } }
  50. PAYUM INTEGRATION SyliusPayumBundle NEW! Integrates Payum library into Sylius checkout

    Replaceable by other bundles in future PayPal Express Checkout and Stripe support Omnipay usage through a bridge
  51. Make your app configurable, EASILY SyliusSettingsBundle You can define settings

    schema and the form User edits the settings through UI You get the access via services and Twig
  52. Settings schema class GeneralSettingsSchema implements SchemaInterface { public function buildSettings(SettingsBuilderInterface

    $builder) { $builder ->setDefaults(array( 'meta_keywords' => 'symfony, sylius, ecommerce, webshop, shopping cart', 'meta_description' => 'Sylius is modern ecommerce solution for PHP.', )) ->setAllowedTypes(array( 'meta_keywords' => array('string'), 'meta_description' => array('string'), )) ; }
  53. EDITING VIA FORM public function buildForm(FormBuilderInterface $builder) { $builder ->add('meta_keywords',

    'text', array( 'constraints' => array(new NotBlank()) )) ->add('meta_description', 'textarea', array( 'constraints' => array(new NotBlank()) )) ; }
  54. None
  55. PROMOTIONS ARE NICE SyliusPromotionsBundle Can be integrated with any Model

    Very flexible Actions and Rules system Support for promotion coupons
  56. PROMOTION STRUCTURE SUPER AWESOME PROMOTION ACTION ACTION ACTION RULE RULE

  57. CUSTOM RULES interface RuleCheckerInterface { /** * @param PromotionSubjectInterface $subject

    * @param array $configuration * * @return Boolean */ public function isEligible(PromotionSubjectInterface $subject, array $configuration); /** * @return string */ public function getConfigurationFormType(); }
  58. YOUR OWN ACTIONS class AddPackageAction implements PromotionActionInterface { public function

    execute(PromotionSubjectInterface $subject, array $configuration) { $package = $this->findPackage($configuration); $item = $this->cartItemRepository->createNew(); $item->setQuantity(1); $item->setUnitPrice(isset($configuration['price']) ? $configuration['price'] : $package->getGrossPrice()); $item->setPackage($package); $subject->addItem($item); } public function getConfigurationFormType() { return 'xyz_promotion_action_add_package_configuration'; } }
  59. None
  60. Sylius Application How to bootstrap Symfony2 shop in minutes? (soon)

    Bringing smile back to developer's faces
  61. INSTALLATION $ composer create-project sylius/sylius -s dev path/to/install $ cd

    path/to/install $ app/console sylius:install $ composer create-project sylius/sylius-standard -s dev path/to/install $ cd path/to/install $ app/console sylius:install
  62. ONE CORE TO RULE THEM ALL SyliusCoreBundle Integrates all the

    bundles together Standard webshop application Contains all the models and services
  63. THE WEB INTERFACE SyliusWebBundle Provides the default web interface for

    Sylius Contains all the templates and menu builders Splitted into Frontend & Backend parts
  64. None
  65. THE BACKEND

  66. public function forwardAction(ProcessContextInterface $context) { $request = $this->getRequest(); $order =

    $this->getCurrentCart(); $this->dispatchCheckoutEvent(SyliusCheckoutEvents::ADDRESSING_INITIALIZE, $order); $form = $this->createCheckoutAddressingForm($order); if ($request->isMethod('POST') && $form->bind($request)->isValid()) { $this->dispatchCheckoutEvent(SyliusCheckoutEvents::ADDRESSING_PRE_COMPLETE, $order); $this->getManager()->persist($order); $this->getManager()->flush(); $this->dispatchCheckoutEvent(SyliusCheckoutEvents::ADDRESSING_COMPLETE, $order); return $this->complete(); } return $this->renderStep($context, $order, $form); }
  67. None
  68. TO DO Documentation, documentation, documentation New default store look Rework

    translations and integrate with CrowdIn Polish the checkout process Integrate BazingaHateoasBundle for API Integrate Symfony CMF and Create.js
  69. COMING SOON... Pull Requests Customer groups Subscriptions support Product reviews

    Symfony CMF integration (editable blocks and pages) Facebook/Amazon and so on...
  70. None
  71. Www.sylius.org Github.com/sylius @pjedrzejewski THANK YOU Questions?