URL: https://linuxfr.org/users/san_guickoo/journaux/symfony-angularjs Title: Symfony, AngularJS, .... Authors: phoenix Date: 2013年09月23日T14:42:03+02:00 License: CC By-SA Tags: symfony2, mongodb et angularjs Score: 13 Bonjour, Erratum: Au début je pensais lancer juste un débat du style : AngularJS + Rest vs Symfony2. Mais je me suis dit que je pouvais faire plus et ~~lancer plusieurs débats~~ parler des différentes briques d'un projet existant. Donc, dans le cadre du développement d'un site Internet e-commerce, j'ai fait du développement en utilisant le framework Symfony2. J'ai testé ce même framework avec une base de données SQL ainsi que la base de données NoSQL MongoDB (base de données orientée document). Dans la suite je vais vous donner mon avis sur le framework, la base de données NoSQL, et des plugins Symfony2 que je livre à la communauté. Symfony2 ======== Symfony 2 est un framework PHP permettant le développement de sites Internet. Il est livré par défaut avec un ORM : Doctrine qui permet de faire correspondre à une structure de base de données des classes PHP qui seront automatiquement hydratées. Le développement PHP s'en retrouve presque agréable (je préfère les langages compilés en règle générale). Le framework est de la même trempe que le Framework Python Django. Ce dernier m'a d'ailleurs tenté (bien qu'interprété aussi), mais une lecture rapide de la documentation m'a donné l'impression d'être un peu moins pratique à utiliser que Symfony2. Peut-être car je ne fais pas de Python. Est-ce que des personnes dans l'assemblée ont déjà développé avec Symfony2 et aussi avec Django, et peuvent donner leur avis ? MongoDB ======= Mon projet d'abord basé sur une base MySQL a été basculé sur une base de données NoSQL nommée MongoDB. La raison n'est pas technique (je n'ai pas besoin de replication, de sharding, ...., pas assez de visiteurs). J'avais juste envie de tester cette base de données sur mon projet. De plus l'aspect orienté document est agréable au développement. Ainsi pour des entités avec forte relation, où on ne récupère pas l'un sans l'autre, une seule requête permet de récupérer toutes les informations. Par exemple, dans une base relationnelle, on aura l'habitude de stocker l'entête de facture dans une table, les lignes dans une autre table, les paiements associés dans une troisième table..... Avec Mongo, si je veux récupérer une facture, en une requête je récupère aussi les lignes et les paiements. Cela implique par contre de ne pouvoir requêter facilement sur les lignes de factures indépendamment de leur entête. Dans le même genre, j'ai entendu parler de CoucheDB. Que pensez-vous des bases de données orientées documents ? De MongoDB en particulier ? Avez-vous déjà utilisé CoucheDB ? Mes contributions ================= Lors du développement de mon projet, j'ai eu besoin de certaines fonctionnalités que je n'ai pas trouvées dans les bundles existant ou qui ne me convenaient pas. Je vous présente ici les différents projets, sachant que pour l'instant ceux-ci ne sont pas parfaits et voir même, la documentation peut laisser à désirer (quand aux tests unitaires ils sont dans le néant). CollectionBundle ---------------- Lien: [CollectionBundle](http://hg.shadoware.org/Software/Symfony2Bundle/CollectionBundle) Dans symfony, il est possible d'ajouter dans un formulaire un type collection pour permettre à un utilisateur de saisir une collection de sous-élément (jointure de type OneToMany): ```php $builder->add('emails', 'collection', array( // chaque item du tableau sera un champ « email » 'type' => 'email', // ces options sont passées à chaque type « email » 'options' => array( 'required' => false, 'attr' => array('class' => 'email-box') ), )); ``` Le problème c'est que dans les formulaires symfony2 il n'est pas possible de gérer des formulaires différents suivant le sous-type de l'objet (gestion de l'héritage dans l'ORM). CollectionBundle propose deux nouveaux types : - Un type permettant de gérer pour chaque classe fille, un formulaire différent. - Un type permettant de gérer des collections de taille fixe : Exemple toujours 5 éléments, quelque soit le nombre d'éléments rééls en base. DoctrineMigrationODMBundle ------------------ Lien : [DoctrineMigrationODMBundle](http://hg.shadoware.org/Software/Symfony2Bundle/doctrine-migrations-bundle) Pour l'ORM Doctrine, il existe DoctrineMigrationBundle qui permet de faire des migrations de schéma, mais il n'existait pas d'équivalent pour l'ODM gérant MongoDB. Même si MongoDB est schémaless, et que les données peuvent être migrées à l'execution, je ressens le besoin d'avoir la possiblité d'exécuter des scripts lors des changements de version, pour : - ajouter de nouvelles données (nécessaires) dans des tables. - renommage de collection, suite à gros refactoring. - voir autre Si ça peut intéresser d'autres personnes. Dites-moi ce que vous en pensez ? Est-ce que je me trompe de chemin ? FPDI et FPDF_TPL ---------------- Des dépôts fpdi et fpdf_tpl qui fonctionnent avec ceux de "tecnick.com/tcpdf" pour les utilisateurs de TCPDF. Liens: - http://hg.shadoware.org/Software/Symfony2Bundle/fpdi - http://hg.shadoware.org/Software/Symfony2Bundle/fpdf_tpl ImageResizerBundle ------------------ Lien : [ImageResizerBundle](http://hg.shadoware.org/Software/Symfony2Bundle/ImageResizerBundle) Dérivé de https://github.com/nresni/ImageResizerBundle, ce bundle ajoute - des caches supplémentaires - de fournir une URL sur la valeur du cache directement (et de générer le cache lors de l'appel de la commande twig) PiwikBundle ----------- Lien : [PiwikBundle](http://hg.shadoware.org/Software/Symfony2Bundle/PiwikBundle) Afin de pouvoir ajouter la gestion de Piwik à l'aide de twig et de service PHP. Ce plugin gère également les paniers e-commerce. AngularJS vs Symfony2 ===================== Voilà la question que je voulais au départ poser. J'ai découvert AngularJS il y a peu de temps, je trouve le framework vraiment génial, sur le principe (coté développeur). Mon application est actuellement : - écrite en PHP (avec Symfony2), - a des URL propres, - un cache d'OPCode APC (pour accélérer le traitement des pages) - cache de template propre à Symfony. Bref, je trouve l'application propre, rapide, ... et là, je me demande de l'utilité de AngularJS. Est-ce que ce n'est pas ce compliquer la vie ? Je m'explique. Utiliser AngularJS nécessite coté serveur une API REST (par exemple). Les templates, les contrôles de formulaires, ... se retrouvent coté client (même si les API REST doivent continuer à vérifier la cohérence des données et la sécurité). Pour une telle application qui nécessite un référencement sur Google, il faut en plus sur le serveur pouvoir afficher les pages générer normalement coté client : - soit par un système de caches si les pages bougent peu, mais dans ce cas, quelle est l'utilité de faire de l'AJAX. - soit en doublant le code et en générant les mêmes pages côté serveur à la demande, mais dans ce cas est-ce vraiment utile de faire de l'AJAX pour de l'AJAX ? - soit en ayant un programme simulant sur le serveur un navigateur et servant les pages simulées au moteur de recherche. Quid de la performance des pages alors ? (Google aime bien que les pages générées soient rapides). De plus en tant qu'entreprise on ne peut pas ignorer les vieilles versions de navigateurs, ou les navigateurs non libres même si on aimerait bien. Donc plusieurs questions: - Est-ce que ce type de framework est vraiment intéressant ? - Compatible et performant avec les vieux navigateurs ? - Comment gérez-vous le cotés SEO de ce type de site ? (Ou est-ce que vous décidez de ne pas le gérer ?) - Est-ce performant ? - Comment gérez vous les connexions des utilisateurs (login + mot de passe) avec les API Rest ? Utilisez-vous une URL de ce type: https://login:password@host... ou un identifiant de session ? (Une API REST devant être normalement Stateless). - Peut-être est-ce dédié uniquement à des applications WEB et non des sites WEB ? Bref quel est votre avis ? Conclusion ========== Merci de m'avoir lu jusqu'ici, j'espère ne pas avoir été trop long. Le site dont je parle est celui-ci : http://monlivretdemesse.fr. Je vous laisse juge de la qualité du site et de la rapidité de génération des pages.