WonderApp et RAD

 

Le projet

WonderApp est une solution qui permet de transformer la façon dont organisateurs et participants communiquent lors des événements (convention, congrès, conférence, etc.).


Grâce à une application mobile (disponible sur iOS et Android) et web, l’organisateur peut mieux communiquer et assurer le suivi de son événement tout en permettant à chaque participant de vivre une expérience personnalisée où les échanges et les rencontres sont les maitres-mots.

Le principe est que l’organisateur puisse lui-même créer et gérer en toute simplicité son application via une plateforme accessible en ligne. Il peut ainsi personnaliser son app, ajouter son contenu (programme, participants, etc.) et animer son événement.

Capture d’écran_2016-05-03_10-14-06

Capture d’écran_2016-05-03_10-21-05

Le défi

Le défi était de mettre en place une API HTTP RESTfull qui serait consommée par des applications iOS, Android et Angular, chacune ayant été réalisée par différents partenaires.

 

Des dailies avec tous les interlocuteurs et un board Trello commun ont assuré le suivi du projet dans sa globalité. La refonte a également permis de revoir l’architecture, d’améliorer et d’ajouter des fonctionnalités au scope existant.

 

Petite cerise sur le gâteau, nous avons adapté le bundle ApiDoc de Nelmio pour que la documentation soit la plus simple possible, avec un minimum de maintenance.

Un proxy de sérialisation pour représenter les ressources

La donnée à sérialiser (la source de notre API) pouvait différer de celle qui était présentée à l’application client. Il y avait donc deux possibilités :

  • sérialiser l’entité Doctrine et ajouter la logique de représentation de l’API dans l’entité
  • créer des proxies de sérialisation qui décorent l’entité et ne contiennent que la logique de représentation

 

Nous avons retenu la seconde solution. Plus “SOLID”, plus extensible, plus propre.

Capture d’écran_2016-05-03_10-22-39

Envoyer tout ça en production

Comme il peut être douloureux de mettre son application en production, il a été décidé de créer deux environnements (production et pré-production). Deployer a été utilisé pour permettre de mettre en production sur les deux environnements aussi souvent que possible. Couplé avec Circle CI, l’application peut être automatiquement déployée lorsque du nouveau code arrive sur une branche.

Capture d’écran_2016-05-03_10-23-43

Créer rapidement de l’accès au contenu

Depuis maintenant 3 ans, nos développeurs re-pensent leur façon d’utiliser Symfony. Cela s’est fait au travers du KnpRadBundle (prochainement déprécié) puis maintenant par les RAD Components. Grâce au projet WonderApp, nous avons pu développer la majorité d’entre eux et améliorer les autres.

KnpLabs/rad-auto-registration

Crée automatiquement certains services si les classes correspondantes ne nécessitent pas d’injection particulière. C’est le cas pour les FormTypes (avant Symfony 2.8), les FormExtensions, les EntityRepositories, les DocumentRepositories (MongoDB et CouchDB), les TwigExtensions et les SecurityVoters.

KnpLabs/rad-user

Nous avions besoin d’une gestion simple et efficace des utilisateurs. Le composant RAD User permet de générer facilement un salt pour la création du mot de passe, de hasher à la volée le plain password ou même de générer celui-ci. Tout cela se fait à travers trois interfaces et trois listeners. Pas besoin de sortir FOSUserBundle si nous n’avons pas besoin de toutes ses fonctionnalités.

KnpLabs/rad-view-renderer

Récupère le résultat du controlleur (si ça n’est pas une réponse) et déduit le nom du template.

AppBundle>ProductsControllers>showAction = App:Products:show.{_format}.twig

KnpLabs/rad-resource-resolver

Permet la résolution de ressources depuis le routing. Il rend l’utilisation du contrôleur plus flexible.

KnpLabs/rad-security

Fonctionne avec le composant de résolution de ressource. Il permet de configurer simplement les conditions d’accès aux ressources résolues.

Ex :

  • Est-ce que j’ai accès à l’application que je veux récupérer ?
  • Est-ce que la photo que je veux supprimer est à moi ?

Ces règles sont donc définies au niveau du routing et non au niveau du contrôleur.

KnpLabs/rad-doctrine-event

Re-dispatche les événements Doctrine dans le dispatcher de Symfony.

KnpLabs/rad-url-generation

Utile pour les applications dont la structure d’URL est complexe.

KnpLabs/rad-fixtures-load

Alice permet de charger facilement des fausses données depuis une définition décrite au format YAML. Ce composant RAD permet de faire appel à Alice pour charger ces données.

 

Encore des questions? Edgar est sur Twitter. Nos contributions sur github et vous pourrez aussi trouver notre moteur de recherche de Bundles.