Développer avec le sylius resourcebundle

40
DÉVELOPPER AVEC LE SYLIUSRESOURCEBUNDLE

Transcript of Développer avec le sylius resourcebundle

Page 1: Développer avec le sylius resourcebundle

DÉVELOPPER AVEC LE SYLIUSRESOURCEBUNDLE

Page 2: Développer avec le sylius resourcebundle

QUI SUIS-JE ?

Arnaud Langlade (@_aRn0D)

Développeur Symfony chez Clever Age

www.clever-age.com / @CleverAge

Page 3: Développer avec le sylius resourcebundle

SYLIUS

Framework E-commerce créé par Paweł Jędrzejewski

Ensemble de bundles Symfony et composants PHP e-commerce

Sylius Starndard Edition

Quelques chiffres : ~200 contributeurs / ~1700 stars

Page 4: Développer avec le sylius resourcebundle

SYLIUSRESOURCEBUNDLELe SyliusResourceBundle vous permet de gérer rapidement et simplement vos ressources et de les

exposer via API REST.

Il n'y a pas que des composants e-commerce dans Sylius !

Page 5: Développer avec le sylius resourcebundle

GESTION DES RESSOURCES? Z'AVEZ DIS CRUD?

CRUD = Create, Read, Update, Delete

Page 6: Développer avec le sylius resourcebundle

UN CRUD, COMMENT ÇA FONCTIONNE?

Page 7: Développer avec le sylius resourcebundle

POURQUOI LA CRÉATION DE CE BUNDLE?Le back office de Sylius est composé d'énormement de CRUDsEviter la duplication de code parce que c'est mal!Développer plus vite en automatisant des tâches

Page 8: Développer avec le sylius resourcebundle

UNE SOLUTION? RESOURCECONTROLLER?Création du ResourceController :

C'est un contrôleur génériquePlus de code, il est intialisé via une configurationIl étend the FOSRestController

Utilisation du EventDispatcher (répartiteur d'évènement) :

Il permet de personnaliser les actionsSolution plus flexible

Page 9: Développer avec le sylius resourcebundle

QUELS SONT ORM/ODM SUPPORTÉS ?Doctrine ORM : Sylius l'utilise par défautDoctrine Phpcr-ODM : Sylius intègre le CMF pour gérer des contenusDoctrine Mongodb-ODMBientôt sûrement plus !

Page 10: Développer avec le sylius resourcebundle

ATTENTION!Ce n'est pas un admin generator!

Il faut créer vos formulaires, vos templates et le routing (pour le moment!)

Page 11: Développer avec le sylius resourcebundle

CRÉER SON CRUD EN QUELQUES MINUTES !Par exemple, créons un CRUD pour gérer des clients (customer).

Page 12: Développer avec le sylius resourcebundle

CONFIGURONS NOS RESSOURCES sylius_resource: resources: myapp.customer: driver: doctrine/orm classes: model: AppBundle\Entity\Customer repository: Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository templates: WebBundle:Backend/Customer myapp.address: # ...

Page 13: Développer avec le sylius resourcebundle

MAIS QUE SE PASSE T'IL ? $ php app/console container:debug | grep customer

myapp.manager.customer alias for "doctrine.orm.default_entity_manager"myapp.controller.customer container Sylius\Bundle\ResourceBundle\Controller\ResourceControllermyapp.repository.customer container Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository

$ php app/console container:debug ­­parameters

sylius.config.classes "myapp.customer": ...

Page 14: Développer avec le sylius resourcebundle

CONFIGURONS NOS RESSOURCES sylius_resource: resources: myapp.customer: driver: doctrine/orm classes: model: AppBundle\Entity\Customer controller: AppBundle\Controller\CustomerController repository: AppBundle\Repository\CustomerRepository templates: WebBundle:Backend/Customer

Page 15: Développer avec le sylius resourcebundle

CRÉONS NOTRE MODÈLE # AppBundle\Entity\Customer.php;

/** * @ORM\Entity * @ORM\Table(name="customer") */class Customer /** * @ORM\Column(type="string", length=100) */ protected $firstName;

/** * @ORM\Column(type="string", length=100) */ protected $lastName;

Page 16: Développer avec le sylius resourcebundle

CRÉONS NOTRE FORMULAIRE // AppBundle\Form\Type\CustomerType.php;

class CustomerType extends AbstractResourceType public function getName() return 'myapp_customer';

Le formulaire doit être défini en tant que servicePattern du nom de formulaire : nom-application_resourceAbstractResourceType permet de configurer le data_class et le validation_group

Page 17: Développer avec le sylius resourcebundle

CRÉONS NOS TEMPLATES # create.html.twig ou update.html.twig #

<form method="POST" action="..."> form_widget(form) </form>

# show.html.twig #

<div> <p> customer.firstname </p> <p> customer.lastname </p></div>

# index.html.twig #

% for customer in customers % customer.fistname customer.lastname % endfor %

Page 18: Développer avec le sylius resourcebundle

CONFIGURONS NOS ROUTES # app/routing.yml

myapp_customer_index: pattern: /customer defaults: _controller: myapp.controller.customer:indexAction

Pattern des clés des routes : nom-application_resource_actionNe pas oublier que les contrôleurs sont définis en tant que serviceActions : index, show, create, update, delete, moveUp, moveDown, revert ou updateState

Page 19: Développer avec le sylius resourcebundle

ET PAF ! ÇA FAIT DES CHOCAPICS !Notre CRUD est prêt à l'emploi !! On crée notre API ?

Page 20: Développer avec le sylius resourcebundle

EXPOSER SES CLIENTS VIA API RESTConfigurer le FOSRestBundle

# app/config.yml

fos_rest: format_listener: rules: ­ path: '/', priorities: ['html', 'json'], fallback_format: html

Le ResourceController retourne le données dans le format souhaité

GET /customer/57 HTTP/1.1Host: myshop.comAccept: application/json

Page 21: Développer avec le sylius resourcebundle

CONFIGURER LE SÉRIALISEUR # Resources/config/serializer/Entity.Customer.yml

AppBundle\Entity\Customer: exclusion_policy: ALL properties: firstName: expose: true type: string lastName: expose: true type: string relations: ­ rel: address href: route: myapp_address_show parameters: id: expr(object.getAddress().getId())

HTTP/1.1 200 OKContent­Type: application/json;

"id": 2, "firstName": "Arnaud", "lastName": "Langlade", "_links": "self": "href": "/address/2"

Page 22: Développer avec le sylius resourcebundle

C'EST TOUT ?Lionframe (Rapid RESTful API Development)Génération automatique des formulaires et du routing

Page 23: Développer avec le sylius resourcebundle

PLUS DE FLEXIBILITÉ ?Le comportement des méthodes du ResourceController est configurable

Page 24: Développer avec le sylius resourcebundle

CONFIGURER LES METHODES DU RESOURCECONTROLLERAjouter une entrée _sylius dans le tableau defaults des routes

# app/routing.yml

myapp_customer_create: defaults: _sylius: template: WebBundle:Backend/Customer:custom_create.html.twig

Page 25: Développer avec le sylius resourcebundle

RÉDIRIGER L'UTILISATEUR # app/routing.yml

myapp_product_create: pattern: /new methods: [GET, POST] _controller: myapp.controller.product:createAction _sylius: redirect: myapp_product_index

# Ou

redirect: route: myapp_product_show parameters: name: resource.sku

Page 26: Développer avec le sylius resourcebundle

RÉCUPÉRER DES DONNÉES DANS LA BDD # app/routing.yml

myapp_customer_index: pattern: / methods: [GET] defaults: _controller: myapp.controller.customer:indexAction _sylius: # $repository­>findBy(["group" => 'my_group']) criteria: group: my_group

# $request­>get('criteria') filterable: true

Page 27: Développer avec le sylius resourcebundle

RÉCUPÉRER DES DONNÉES DANS LA BDD # app/routing.yml

myapp_customer_index: pattern: / methods: [GET] defaults: _controller: myapp.controller.customer:indexAction _sylius: # $repository­>findByFilter($request­>get('filter')) repository: method: findByFilter arguments: [$filter]

Page 28: Développer avec le sylius resourcebundle

LISTER SES RESSOURCES # app/routing.yml

myapp_customer_index: pattern: / methods: [GET] defaults: _controller: myapp.controller.customer:indexAction _sylius: # Trie sorting: updatedAt: desc # Ou asc

# $request­>get('sorting'); sortable: true

# Paginate paginate: 50

Page 29: Développer avec le sylius resourcebundle

MOTEUR D'EXPRESSION # app/routing.yml

myapp_order_index: path: /orders methods: [GET] defaults: _controller: app.controller.order:indexAction _sylius: repository: # $repository­>findOrderByCustomer([$customer]); method: findOrderByCustomer arguments: ["expr:service('security.context').getToken().getUser()"]

Page 30: Développer avec le sylius resourcebundle

VOUS VOULEZ MUTUALISER VOTRE CODE ?

Page 31: Développer avec le sylius resourcebundle

SYLIUS FONCTIONNE AVEC DES BUNDLESIls doivent être facilement étendablesIls peuvent supporter plusieurs "drivers" (ORM/ODM)Ils ne doivent être couplés les uns aux autres

Page 32: Développer avec le sylius resourcebundle

LA CONFIGURATION SÉMANTIQUE customer_bundle: driver: doctrine/orm templates: customer: CustomerBundle:Backend/Customer address: ... validation_groups: customer: [myapp] address: ... classes: customer: model: Myapp\CustomerBundle\Model\Customer controller: Sylius\Bundle\ResourceBundle\Controller\ResourceController repository: Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository form: default: Myapp\CustomerBundle\Form\Type\CustomerType choice: Myapp\CustomerBundle\Form\Type\CustomerChoiceType address: ...

Page 33: Développer avec le sylius resourcebundle

MAIS QUE SE PASSE T'IL? $ php app/console container:debug | grep customer

myapp.controller.customer container Sylius\Bundle\ResourceBundle\Controller\ResourceControllermyapp.manager.customer n/a alias for doctrine.orm.default_entity_managermyapp.repository.customer container Sylius\Bundle\ResourceBundle\Doctrine\ORMEntityRepositorymyapp.form.type.customer container myapp\CustomerBundle\Form\Type\CustomerType

$ php app/console container:debug ­­parameters | grep customer

myapp.model.customer.class myapp\CustomerBundle\Model\Customermyapp.model.customer.class myapp\CustomerBundle\Model\Customermyapp.controller.customer.class Sylius\Bundle\ResourceBundle\Controller\ResourceControllermyapp.repository.customer.class Sylius\Bundle\ResourceBundle\Doctrine\ORMEntityRepositorymyapp.form.type.customer.class myapp\CustomerBundle\Form\Type\CustomerTypemyapp.validation_group.customer ["myapp"]myapp_customer.driver doctrine/orm

Page 34: Développer avec le sylius resourcebundle

ETENDRE FACILEMENT VOTRE BUNDLEUtiliser l'injecteur de dépendences (Dependency Injector)Déclarer votre classe en tant mapped-superclass (évènement loadClassMetadata)

Page 35: Développer avec le sylius resourcebundle

GÉRER PLUSIEURS DRIVERSCréer votre "Doctrine Mapping Driver"Fournir plusieurs implementations Doctrine pour un modèleVos documents et entités sont dans le même namespace

Page 36: Développer avec le sylius resourcebundle

LIMITER LE COUPLAGE DE VOS BUNDLESUtiliser le Resolve Target Entity ListenerDéfinir des relations entre différentes entités sans les écrire en durIl ré-écrit les paramètres targetEntity dans le mapping de votre modèle

<!­­ Resources/config/doctrine/order.xml ­­>

<one­to­many field="orders" target­entity="Sylius\Component\Order\Model\OrderInterface"> <!­­ ... ­­></one­to­many>

Page 37: Développer avec le sylius resourcebundle

VOUS ÊTES ÉQUIPÉS POUR CONSTRUIRE VOS BUNDLES!

Page 38: Développer avec le sylius resourcebundle

GO TO THE FUTURE!Refactoring de la SyliusResourceExtension

Rendre le système plus flexibleUniformiser la configuration

De nouveaux FormType ?Un datagrid ?

Page 39: Développer avec le sylius resourcebundle

VENEZ CONTRIBUER!Merci à tous les contributeurs!N'hésister pas à nous soumettre vos PRs...... surtout si vous aimez écrire de la doc :D !

Page 40: Développer avec le sylius resourcebundle

MERCI! QUESTIONS ?

Arnaud Langlade

Twiter @_aRn0D

Sylius : www.sylius.org