Upload
nyalab
View
1.528
Download
1
Embed Size (px)
Citation preview
Symfony 2(le retour)
Sebastien B. GibTalk du 2011-09-15
@Nyalab on twitterhttp://www.slideshare.net/Nyalabhttps://github.com/Nyalab
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
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...)
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)
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 §§§
A quoi ça ressemble ?
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
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)
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)
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; }
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');}
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
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 %}
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
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.
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 !
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');
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 !!!