En route pour Symfony 5

Aujourd’hui je partage avec vous quelques notes sur ma lecture du livre en route pour Symfony 5 ou bien en anglais, Symfony 5 The Fast Track.

Symfony est l’un des projets PHP les plus réputés. Il s’agit à la fois d’un framework full-stack robuste, et d’un ensemble populaire de composants réutilisables.

Si vous découvrez Symfony, l’arrivée de Symfony 5 est le moment idéal
pour apprendre à développer une application, étape par étape. Ce livre présente la puissance du framework et comment vous pouvez améliorer votre productivité.

Si vous avez déjà développé avec Symfony, vous devriez le redécouvrir. Le framework a énormément évolué ces dernières années et l’expérience de développement s’est considérablement améliorée.

Après cette petite introduction, on commence par la listes des notes

PHPUnit

  • À partir d’un test PHPUnit, vous pouvez obtenir n’importe quel service depuis le conteneur grâce à self::$container->get() ; il donne égalementaccès aux services non publics.
  • Les data providers de PHPUnit nous permettent de réutiliser la même logique de test pour plusieurs scénarios

Configuration

  • En production, SymfonyCloud prend en charge le paramétrage des variables d’environnement sensibles : symfony var:set –sensitive AKISMET_KEY=abcdef
  • Au lieu d’utiliser plusieurs variables d’environnement, Symfony peut gérer un coffre-fort où vous pouvez stocker plusieurs chaînes secrètes.L’une de ses caractéristiques les plus intéressantes est la possibilité de faire « committer » l’espace de stockage dans le dépôt (mais sans la clé pour l’ouvrir). Une autre fonctionnalité intéressante est qu’il peut gérer un coffre-fort par environnement. Les chaînes secrètes sont des variables d’environnement déguisées.
  • L’utilisation de variables d’environnement réelles est la meilleure façon de définir des valeurs comme APP_ENV en production. Mais sur les machines de développement, avoir à définir beaucoup de variables d’environnement peut s’avérer fastidieux. Définissez-les plutôt dans un  fichier .env
  • Le fichier .env est « commité » sur le dépôt git et liste les valeurs par défaut  de la production. Vous pouvez surcharger ces valeurs en créant un fichier  .env.local  Ce fichier ne doit pas être « commité »
  • Bundles Symfony se sont des paquets qui ajoutent des fonctionnalités de haut niveau ou fournissent des intégrations avec des bibliothèques tierces(les bundles sont principalement créés par la communauté). 
  • Composant Symfony se sont des paquets qui implémentent les fonctionnalités  de base et les abstractions de bas niveau dont la plupart des applications ont besoin (routage, console, client HTTP, mailer, cache, etc)
  • SymfonyCloud effectue certaines optimisations lors du  déploiement d’une application Symfony comme l’optimisation del’autoloader Composer ( –optimize-autoloader –apcu-autoloader — classmap-authoritative ). Il optimise également les variablesd’environnement définies dans le fichier .env (pour éviter d’analyser le fichier pour chaque requête) en générant le fichier .env.local.php :

Form

  • Un form type décrit les champs de formulaire liés à un modèle. Il effectue la conversion des données entre les données soumises et les propriétés de la classe de modèle.

Event

  • Ne confondez pas les « listeners » d’événements Doctrine et ceux de Symfony. Même s’ils se ressemblent beaucoup, ils n’utilisent pas la même infrastructure en interne.
  • Lorsque le comportement n’a besoin d’aucun service et ne doit être appliqué qu’à un seul type d’entité, définissez un callback dans la classe entité.
  • Pour éviter d’avoir un fichier de configuration qui décrit les événements qu’un listener veut écouter, créez un subscriber. Un subscriber est un listener avec une méthode statique getSubscribedEvents() qui retourne sa configuration. Ceci permet aux subscribers d’être enregistrés automatiquement dans le dispatcher Symfony.
  • Symfony intègre un composant Event Dispatcher. Un dispatcher répartit certains événements à des moments précis que les « listeners » peuvent écouter. Les « listeners » sont des hooks dans le cœur du framework. Les événements sont des points d’extension bien définis qui rendent le framework plus générique et extensible.

TWIG

  • Twig a la notion de variables globales. Une variable globale est disponible dans tous les templates générés. Vous pouvez les définir dans un fichier de configuration, mais cela ne fonctionne que pour les valeurs statiques
  • Pour gérer la pagination dans le template, transmettez à Twig le Doctrine Paginator au lieu de la Doctrine Collection.
  • Un modèle peut définir des blocks . Un block est un emplacement où les templates enfants, qui étendent le modèle, ajoutent leur contenu.
  • Le fichier .env est « commité » sur le dépôt git et liste les valeurs par défaut  de la production. Vous pouvez surcharger ces valeurs en créant un fichier  .env.local  Ce fichier ne doit pas être « commité »

Docker

  • docker-compose ps
  • docker-compose up -d
  • docker-compose logs
  • docker exec -it formation_database_1 psql -U main -W main

Symfony Cli Command

  • symfony logs –worker=messages all
  • symfony console debug:autowiring 
  • symfony console make:functional-test Controller\\ConferenceController
  • symfony console make:auth
  • symfony console security:encode-password
  • symfony console make:migration
  • symfony env:delete –env=sessions-in-redis –no-interaction
  • symfony env:debug
  • symfony open:remote => ouvrir la branche SymfonyCloud dans un navigateur
  • symfony env:create => create a new env in SymfonyCloud
  • symfony var:export
  • symfony tunnel:close
  • symfony run psql => permet de se connecter automatiquement à la base de données hébergée avec Docker grâce aux variables d’environnement exposées par symfony run
  • symfony console make:controller ConferenceController
  • symfony logs
  • symfony open:local
  • symfony server:start -d
  • symfony new formation –version=VERSION => create a new project
  • symfony console messenger:failed:retry
  • symfony console messenger:failed:show
  • symfony open:remote:rabbitmq
  • symfony open:local:rabbitmq
  • symfony console translation:update fr –force –domain=messages

Messenger

  • Lorsqu’une action doit être exécutée de manière asynchrone, envoyez un message à un messenger bus. Le bus stocke le message dans une filed’attente et rend immédiatement la main pour permettre au flux des opérations de reprendre aussi vite que possible.
  • Un consumer s’exécute continuellement en arrière-plan pour lire les nouveaux messages dans la file d’attente et exécuter la logique associée.
  • Le consumer peut s’exécuter sur le même serveur que l’application web, ou sur un serveur séparé.
  • Un message est une classe de données (data object), qui ne doit contenir aucune logique. Il sera sérialisé pour être stocké dans une file d’attente
  • Dans le monde de Messenger, nous n’avons pas de contrôleurs, mais des gestionnaires de messages.MessageHandlerInterface est une interface de marqueur. Elle aide seulement Symfony à enregistrer et à configurer automatiquement laclasse en tant que gestionnaire Messenger
  • Par convention, la logique d’un gestionnaire réside dans une méthode appelée __invoke() .

Mailer

  • Une variable d’environnement peut être « traitée » avant d’être utilisée. Ici, nous utilisons le processeur default afin d’utiliser la valeur duparamètre default_admin_email si la variable d’environnement ADMIN_EMAIL n’existe pas.
  • Pour envoyer un email, vous pouvez choisir entre plusieurs abstractions de classes d’Email : depuis Message , celle de plus bas niveau, à NotificationEmail , celle de niveau le plus élevé. Vous utiliserez probablement la classe Email le plus souvent, mais NotificationEmail est le choix parfait pour les emails internes.
  • Le template par défaut NotificationEmail utilise Inky au lieu de HTML pour générer les emails. Il permet de créer des emails responsives compatibles avec tous les clients de messagerie courants.
  • Dans les emails, générez les URLs avec url() au lieu de path() puisque vous avez besoin qu’elles soient absolues (avec le schéma et l’hôte).
    • symfony open:local:webmail
    • symfony env:setting:set email on

Cache

  • La méthode setSharedMaxAge() configure l’expiration du cache pour les reverse proxies. Utiliser setMaxAge() permet de contrôler le cache du navigateur
    • curl -s -I -X GET https://127.0.0.1:8000/
    • curl -I -X PURGE -u admin:Nour2020 https://127.0.0.1:8000/admin/http-cache
  • Lorsque vous voulez mettre en cache un fragment d’une page, déplacez-le en dehors de la requête HTTP en cours en créant une sous-requête. ESI correspond parfaitement à ce cas d’utilisation. Un ESI est un moyen d’intégrer le résultat d’une requête HTTP dans une autre.
  • Si Symfony détecte un reverse proxy qui sait comment traiter les ESIs, il active automatiquement le support (sinon, par défaut, il génère le rendu de la sous-demande de manière synchrone).
  • L’invalidation du cache en production ne devrait probablement jamais être nécessaire, sauf en cas d’urgence, et peut-être si vous n’êtes pas dans la branche master . Si vous avez besoin de souvent purger le cache, cela signifie probablement que la stratégie de mise en cache doit être modifiée (en réduisant le TTL, ou en utilisant une stratégie de validation au lieu d’une stratégie d’expiration).

WebPack

  • yarn init -y => Initialisez le fichier package.json (équivalent au fichier composer.json pour  JavaScript)
  • yarn add node-sass « sass-loader@^7.0.1 » –dev
  • yarn add bootstrap jquery popper.js bs-custom-file-input –dev
  • symfony run yarn encore dev

C’était juste quelques notes sinon le livre est plein d’exemple de A à Z.

Le livre est vraiment hyper important pour les développeurs Symfony. Je conseille vivement de l’acheter