talk interne - 20110916 - symfony2

18
Symfony 2 (le retour) Sebastien B. GibTalk du 2011-09-15 @Nyalab on twitter http:// www.slideshare.net/Nyalab https://github.com/Nyalab

Upload: nyalab

Post on 25-May-2015

1.524 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: Talk Interne - 20110916 - Symfony2

Symfony 2(le retour)

Sebastien B.                                                                                                                   GibTalk du 2011-09-15

@Nyalab on twitterhttp://www.slideshare.net/Nyalabhttps://github.com/Nyalab

Page 2: Talk Interne - 20110916 - Symfony2

Le quizz du parfait petit dev web

 - Pourquoi utiliser un Framework ?    => Exemple de l'escalade d'un rocher (chemin déja tracé)  - Que nous fournit un framework ?    => Outils (user flash, form builders, security abstraction, ...)    => Méthodologie (mvc, config, routing, ...)  - Un framework nous donne une abstraction, une facilité    => Permet de se concentrer sur la partie métier  - Mises à jour    => Si on modifie du code interne au framework, possibilité de transparence totale pour le dev

Page 3: Talk Interne - 20110916 - Symfony2

Pourquoi Symfony?

    => Sensio Labs depuis 12 ans     => Symfony depuis 2005     => Grands comptes : Dailymotion, Yahoo, Opensky, PHPBB     => Qualité du code (Respect standards, Commentaires, ...)     => Communauté (Plus grosse communauté Github)     => Interopérabilité (Composants, PHPUnit, Namespaces...)

Page 4: Talk Interne - 20110916 - Symfony2

Pourquoi Symfony 2 ?

    => 3 fois plus rapide que Symfony 1.4 ou que Zend 1.0

    => We do Bundles now. Bundles are cool.

    => Distribs selons chaque besoin ! (Silex, ...)

    => Communauté mieux organisée (Mailing list, IRC, Wiki, Bloggers, Forum ...)

    => Developper Friendly (Beaucoup de feedback demandé, belle web debug toolbar, confort de codage, ...)

    => Relativement facile à prendre en main (sauf pour Tristan bien sur)

Page 5: Talk Interne - 20110916 - Symfony2

Comment on commence ?

1 / Télécharger la distrib voulue    => Standard Edition (que celle la pour le moment)    => Kitchen Sink    => CMS Edition    => ...

2 / Dézipper dans le RootDirectory 3 / Config avec client web (connexion db, ...) 4 / PROFIT §§§    

Page 6: Talk Interne - 20110916 - Symfony2

A quoi ça ressemble ?

Page 7: Talk Interne - 20110916 - Symfony2

Symfony 2 Standard Edition

 => Quelques composants : BrowserKit, ClassLoader, Config, Console, CssSelector, DependencyInjection, DomCrawler, EventDispatcher, Finder, Form, HTTPFoundation, HTTPKernel, Locale, Process, Routing, Security, Serializer, Templating, Translation, Validator, YAML

Page 8: Talk Interne - 20110916 - Symfony2

Mais je vais être perdu depuis Symfony 1 ?

 - Le dossier app/    => On ne code plus dedans, c'est juste la conf, l'i18n et quelques templates  - Les plugins    => Ils deviennent des bundles    => Vois le code de ton site comme un bundle lui-même : Modules, libs, schema, ... => Plugins => Bundle  - Le vendor/    => Il ne bouge pas, on le voit avec l'install par défaut  - Le web/    => Tout est en bundles, donc les assets aussi (sauf en prod)

Page 9: Talk Interne - 20110916 - Symfony2

Mais je vais être perdu depuis Symfony 1 ?

 - L'autoload    => Symfony 1 : Stockage dans tableau en cache "nom de classe" => "tel fichier" (donc symfony cc en prod)    => Symfony 2 : UniversalClassLoader, on doit faire attention au nommage (conventions, best practices, ...), exemple : namespace Gib\Bundle\MeteoBundle class GibMeteoBundle extends Bundle car dans app/autoload.php $loader->registerNamespaces(array(    'Gib' => __DIR__ . '/../vendor/bundles',)); Autoload = Bon nommage des fichiers = Performance = Conventions (Fallback dans le src)

Page 10: Talk Interne - 20110916 - Symfony2

Mais je vais être perdu depuis Symfony 1 ? - Vu que Plugin ~= Bundles, comment on déclare tout ça ?

     => Symfony 1 : ProjectConfigurationClass public function setup(){    $this->enablePlugins(/* some awesome seb plugins */); }     => Symfony 2 : App/Kernel.php public function registerBundles(){    $bundles = array(        new Symfony\Bundle\FrameworkBundle\FrameworkBundle(),        new Symfony\Bundle\TwigBundle\TwigBundle(),        ...        new Gib\Bundle\MeteoBundle\MeteoBundle()    );    return $bundles; }

Page 11: Talk Interne - 20110916 - Symfony2

Mais je vais être perdu depuis Symfony 1 ? - Yml : Routing / Config

    => Symfony 1 : Tous les config / routing étaient chargés automatiquement du moment que le plugin était activé     => Symfony 2 : On explicite (gain de performances) Ex: app/config/routing.yml_meteoroutes:    resource: "@MeteoBundle/resources/config/routing.yml" 

    => Symfony 1 : Création dans app.yml de variables avec problèmes que l'on connait (sous niveau, tableaux, ...)     => Symfony 2 : Ex : app/config/config.ymlparameters:    email.from_address : foo@barEx : actionspublic function sendMailAction($mail){    $from = $this->container->getParameter('email.from_address');}

Page 12: Talk Interne - 20110916 - Symfony2

Some cool stuff : Service container !

Un grand factory qui permet de config autant de services qu'on veut !Ex : app/config/config.yml services:    my_mailer:        class:    Gib\Bundle\Mailer        arguments: [sendmail]    my_meteo:        class:    Gib\Bundle\Meteo

class MeteoController extends Controller{    public function meteoAction()    {        $meteo = $this->get('my_meteo');        $data = $meteo->getWeather('Toulouse', 'today'); // Always sunny    }}

Of course, factory = pas d'appel au service, pas d'instanciation de la classe (pas comme les user sur symfony 1 par exemple).Other cool things : Public / Private, Interdépendance de services, alias, conf en extension

Page 13: Talk Interne - 20110916 - Symfony2

Some cool stuff : Twig ! Un moteur de template avec lequel on ne sera jamais bloqué !Exemple:  => <h1>{{ page_title }}</h1>  => <ul>{% for item in list %}<li><a href="{{ item.href }}">{{ item.txt }}</a>{%endfor%}</ul>  => {{ }} : "says" something, {%%} "does" something  => {{ title | upper }} : majuscules  => {% for i in 0..10 %} <div class="{{ cycle(['odd','even'], i) }}"> </div> {% endfor %}  => {% include "GibMeteoBundle:Carte:France.twig" with {"data" : data} %}  => slots, héritage, ... => fonctions ajoutées par Symfony : url(), path(), asset() ... => output escaping => assets : {% block javascripts %}    {{ parent() }}    <script src="{{ asset('/js/rhy.js') }}" type="text/javascript"></script>{% endblock %}

Page 14: Talk Interne - 20110916 - Symfony2

Some cool stuff : Assetic !

 - Bundle développé par Kris Wallsmith - Se couple facilement avec twig - Prend les assets - Les assemble - Passe par un système de filtre (où on met généralement le YUICompressor pour la minification) - Donc possibilité de créer ses propres filtres ! (suppresion des alert(), règles spécifiques, réécriture de version de libs, ...) - Contrôle du nom de fichier final, ... etc etc - Dans des utilisations avancées, permet la compression d'images en qualité, en taille ... etc

Page 15: Talk Interne - 20110916 - Symfony2

Some cool stuff : Doctrine Bundle

Symfony 2 = grosse communauté = outils récents !=> Bundle de gestion Mongo par Doctrine ! - Facilité d'écriture - Gestion "fausses transactions" - des méthodes spéciales - de la magie ! (findOneBy*)

=> Bundle de gestion des migrations par Doctrine ! - Objets manipulables dans un B.O par exemple - Bonnes explications des migrations dans les ifchiers générés

=> Bundle de gestion des fixtures par Doctrine ! - Objets manipulables entre les fixtures - Ecriture en PHP, possibilité d'utiliser les mécanismes symfony

=> Meilleure gestion des fichiers (type="file"), multiples conn.

Page 16: Talk Interne - 20110916 - Symfony2

Some cool stuff : Sensio Bundles

 => Sensio Generator Bundle !  - Comme le CRUD de base dans Symfony - On peut créer ses propres generators   => Sension Framework Bundle !  - On peut définir les classes de base     Exemple : problème de faire hériter toutes les actions pour avoir un preexecute, postexecute - Gestion de ses propres annotations ! 

Page 17: Talk Interne - 20110916 - Symfony2

Some cool stuff : Le finder

use Symfony\Component\Finder\Finder;

$finder = new Finder();$finder->files()->in(__DIR__);

foreach ($finder as $file) {    print $file->getRealpath()."\n";}

$finder->in('ftp://example.com/pub/');$finder->name('photos*')->size('< 100K')->date('since 1 hour ago');$finder->depth('< 3');

Page 18: Talk Interne - 20110916 - Symfony2

Some cool stuff : Beaucoup d'autres !

 => Créations de ses commandes + generator = grosses possibilités => Gestion native de logs avec Monolog ! => Simulation de l'héritage multiple avec l'event dispatcher !  => Gestion des tags ESI native dans les annotations du code (coucou Rui !) => Gestion native des headers standards HTTP via annotations ! => Urls complexes ? _route: pattern: coucou/{var} requirements: var: ".+" (/ autorisé !) => Tunnel Https géré ultra simplement via attribut de route !

 => http://www.symfony2bundles.org !!!