Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Symfony + Backbone.js

Symfony + Backbone.js

sfPot Marseille 2013-09 - Retour d'expérience

Avatar for Jérémy Romey

Jérémy Romey

September 12, 2013
Tweet

More Decks by Jérémy Romey

Other Decks in Programming

Transcript

  1. Jérémy Romey Symfony, Propel, Composer, atoum, ... VeryLastRoom @jeremyFreeAgent -

    - - Twitter SensioLabsConnect Github GameCenter you can find me everywhere, mais surtout à la Caravelle
  2. Application Backbone.js avec Marionette Application Symfony Routing Symfony en JS

    Templates avec Twig JS Utilisation des variables Assetic Date formattée avec la locale i18n : translations Symfony en JS
  3. Bower Bower est un manager de libraries Javascript. Dépendances d'un

    projet dans un fichier bower.json: { "dependencies": { "bootstrap": "3", "backbone.marionette": "1.1.0", "backbone-relational": "0.8.*", "backbone-query-parameters": "latest", "moment": "2.1.*" } } $ bower install
  4. Assets dans le layout Symfony On structure les fichiers: Model

    dans ../marionette/model Collection dans ../marionette/collection Controller dans ../marionette/controller View dans ../marionette/view
  5. Assets dans le layout Symfony Les dépendences {% javascripts '../components/jquery/jquery.min.js'

    '../components/moment/min/moment.min.js' '../components/underscore/underscore-min.js' '../components/backbone/backbone-min.js' '../components/backbone-relational/backbone-relational.js' '../components/backbone.marionette/lib/backbone.marionette.min.js' '../components/backbone-query-parameters/backbone.queryparams.js' ...
  6. Assets dans le layout Symfony Les variables de base de

    l'app ... '../marionette/init.js' ... ../marionette/init.js: Albuquerque = {}; Albuquerque.Model = {}; Albuquerque.Collection = {};
  7. Assets dans le layout Symfony Les models ... '../marionette/model/DeaAgent.js' '../marionette/model/MethCooker.js'

    '../marionette/model/MethDealer.js' ... ../marionette/model/DeaAgent.js: Albuquerque.Model.DeaAgent = Backbone.Model.extend({ urlRoot: 'dea-agents' });
  8. Assets dans le layout Symfony Les collections ... '../marionette/collection/DeaAgent.js' '../marionette/collection/MethCooker.js'

    '../marionette/collection/MethDealer.js' ... ../marionette/collection/DeaAgent.js: Albuquerque.Collection.DeaAgent = Backbone.Collection.extend({ url: '/dea-agents', model: Albuquerque.Model.DeaAgent });
  9. Assets dans le layout Symfony Les views ... '../marionette/view/Empty.js' '../marionette/view/WalterWhiteHouse/Bathroom.js'

    '../marionette/view/WalterWhiteHouse/Bedroom.js' '../marionette/view/WalterWhiteHouse/Kitchen.js' '../marionette/view/LosPollosHermanos/Lab.js' '../marionette/view/LosPollosHermanos/Laundry.js' ... ../marionette/view/LosPollosHermanos/Lab.js : App.View.LosPollosHermanos.Lab = Marionette.View.extend({ tagName: 'div', template: '<h1>Los Pollos Hermanos best meth lab</h1>', render: function() { this.$el.html(this.template); return this; } });
  10. Assets dans le layout Symfony Les controllers ... '../marionette/controller/Meth.js' output='js/app.js'

    %} <script type="text/javascript" src="{{ asset_url }}"></script> {% endjavascripts %} ../marionette/controller/Meth.js: App.Controller.Meth = Marionette.Controller.extend({ //... });
  11. Application Symfony Web API qui fait le job, l'app Backbone.js

    est cliente de cette API. fetch et save
  12. Routing Symfony en JS Il y a un bundle pour

    ça: FOSJsRoutingBundle friendsofsymfony/jsrouting-bundle
  13. Routing Symfony en JS Dans le controller Symfony: /** *

    @Route("/meth-cookers/{id}", name="meth_cooker", options={"expose"=true}) */ Modification des assets: 'bundles/fosjsrouting/js/router.js' 'js/fos_js_routes.js' Dans la console: $ app/console fos:js-routing:dump Dans Backbone.js: url = Routing.generate('meth_cookers', { id: 'walter-white' }); // url: /meth-cookers/walter-white
  14. Templates avec Twig JS Il y a un bundle pour

    ça: JMSTwigJsBundle jms/twig-js-bundle
  15. Templates avec Twig JS Différences avec Twig PHP: On ne

    peut y passer que des objets JSON Seulement quelques fonctions et les filters - fork it! Twig JS compile des fichiers JS à partir des templates
  16. Templates avec Twig JS ../marionette/template/LosPollosHermanos/Lab.twig: {% twig_js name="LosPollosHermanos_Lab" %} <h1>Los

    Pollos Hermanos best meth lab</h1> <p>Surface: {{ lab.surface }}</p> Modification des assets: '../vendor/jms/twig-js/twig.js' {% javascripts %} '../marionette/template/LosPollosHermanos/Lab.twig' output='js/templates.js' filter="twig_js" %} <script type="text/javascript" src="{{ asset_url }}"></script> {% endjavascripts %} ../marionette/view/LosPollosHermanos/Lab.js: App.View.LosPollosHermanos.Lab = Marionette.View.extend({ tagName: 'div', // template: '<h1>Los Pollos Hermanos best meth lab</h1>', template: LosPollosHermanos_Lab, render: function() { // this.$el.html(this.template); this.$el.html(Twig.render(this.template, {'lab': {'surface': 20 }})); return this; } });
  17. Utilisation des variables Assetic Permet de charger des fichiers JS

    différents Deux variables: env et locale Example avec locale [en, fr]: va générer js/lang.fr.js (lib-a/fr.js + lib-b/fr.js) et js/lang.en.js (lib-a/en.js + lib-b/en.js) {% javascripts %} '../lib-a/{locale}.js' '../lib-b/{locale}.js' output='js/lang.{locale}.js' vars=['locale'] %} <script type="text/javascript" src="{{ asset_url }}"></script> {% endjavascripts %}
  18. Utilisation des variables Assetic Avec Twig JS: trans() et locale

    permet de traduire des strings lors de la compilation en utilisant les translations de Symfony! Example avec locale [en, fr]: va générer js/templates.fr.js et js/templates.en.js dont le contenu sera différent selon la locale {% javascripts '../marionette/template/LosPollosHermanos/Lab.twig' output='js/templates.{locale}.js' filter="twig_js" vars=['locale'] %} <script type="text/javascript" src="{{ asset_url }}"></script> {% endjavascripts %}
  19. Date formattée avec la locale Avec moment.js: Ajout dans les

    assets en utilisant locale: {% javascripts '../components/moment/min/lang/{locale}.js' output='js/date.{locale}.js' vars=['locale'] %} <script type="text/javascript" src="{{ asset_url }}"></script> {% endjavascripts %} Création d'un filter Twig JS: Twig.setFilter('date', function() { return moment(date).format('LL'); }); Utilisation dans un template Twig JS: {{ meth.delivery.scheduledDate|date() }}
  20. i18n : translations Symfony en JS Il y a un

    bundle pour ça: BazingaExposeTranslationBundle willdurand/expose-translation-bundle
  21. i18n : translations Symfony en JS Dans app/Resources/translations/messages.fr.yml: lospolloswelcome: "Bienvenue

    à Los Pollos %name%, vous aimez le poulet ?" Utilisation: Translator.get('lospolloswelcome', { "name" : "Jesse Pinkman" }); // Bienvenue à Los Pollos Jesse Pinkman, vous aimez le poulet ?
  22. Conclusion Vous pouvez désormais vous servir dans votre application Backbone.js

    de ce que vous avez fait dans votre application Symfony!