Vocabulaire

FQCN

Le FQCN (Fully Qualified Class Name) est le nom complet d’une classe, donc le nom de la classe précédé de ses espaces de nom.

Exemple : Symfony\Component\HttpFoundation\Request

Ici, le nom de la classe est Request. L’ensemble forme un FQCN.

MVC

MVC signifie Modèle Vue Contrôleur.

C’est une manière d’organiser son application en la séparant en 3 grandes couches :

  • Le modèle, représentant les données (BDD)
  • La vue, pour l’affichage (les templates)
  • Les contrôleurs, qui contiennent la logique métier (le code)

Type-hint

Dans une application Symfony, un type-hint est un type qu’on indique dans les paramètres d’un contrôleur, ou bien d’un constructeur de classe.

Il est ensuite analysé par Symfony pour trouver le service correspondant et pouvoir en fournir une instance au contrôleur ou au service concerné.

Contrôleur

Par exemple, dans un contrôleur :

#[Route('/new', name: 'app_article_crud_new', methods: ['GET', 'POST'])]
public function new(
    Request $request, // <-- Type-hint spécial : fournit la requête entrante au contrôleur
    EntityManagerInterface $entityManager, // <-- Type-hint
    SluggerInterface $slugger // <-- Type-hint
): Response
{
    //...
}

Service

class NewsletterService
{
    public function __construct(
        private MailerInterface $mailer, // <-- Type-hint
        private string $adminEmail
    ) {
    }

    //...
}

On peut type-hinter des types autowirés

Slug

Un slug est une chaîne de caractères ne contenant pas d’espaces, d’accents, de caractères spéciaux, etc…la rendant utilisable dans des URL ou des noms de fichiers.

Par exemple, si on a un article dont le titre est :

Découvrez l'injection de dépendances dans Symfony

Alors le slug correspondant pourrait être :

decouvrez-l-injection-de-dependances-dans-symfony

L’article pourrait alors être visible à l’adresse suivante, par exemple :

https://domain.com/articles/decouvrez-l-injection-de-dependances-dans-symfony

Recette

Une recette sert à préconfigurer un package ou un bundle lors de son installation au sein d’une application Symfony. Elle est exécutée par l’outil Symfony Flex.

Symfony Flex est un plugin Composer : lorsqu’on installe un package avec composer require XXX, Symfony Flex va vérifier s’il existe une recette pour ce package. Une recette contiendra par exemple des fichiers de configuration, ou bien des fichiers à créer dans l’arborescence du projet. Le but est de faciliter l’intégration d’un package au sein d’une application Symfony.

Interface

En POO, une interface est une abstraction : elle ne contient que des signatures de méthodes. Ainsi, toute classe qui implémente une interface devra founir une définition pour chaque méthode de l’interface.

Exemple

Je souhaite développer un système d’alertes. Par exemple, à l’arrivée d’un événement, je veux alerter un utilisateur, ou bien l’administrateur de l’application.

Mais pour envoyer des alertes, je peux utiliser différents moyens : SMS, email, alerte push sur une application mobile, etc…

Je vais d’abord définir une interface, une abstraction, me permettant d’indiquer comment un système d’alerte doit se comporter :

<?php

interface AlertInterface
{
    /**
     * Send alert notification
     */
    public function sendAlert();
}

Ensuite, si je veux définir la manière d’envoyer une alerte par SMS, je peux créer une classe et indiquer qu’elle implémente AlertInterface :

<?php

class SmsAlert implements AlertInterface
{
    public function sendAlert()
    {
        // Envoi d'un SMS
    }
}

Mais si je veux également définir l’envoi par email :

<?php

class EmailAlert implements AlertInterface
{
    public function sendAlert()
    {
        // Envoi d'un email
    }
}

Ainsi, au niveau de AlertInterface, j’indique simplement comment un système d’alerte doit se comporter. Ensuite, je peux définir des classes qui implémentent cette interface, pour réaliser le système voulu, mais de façons différentes.

Polyfill

Un polyfill permet, dans une version précise, d’utiliser des fonctionnalités présentes dans une version plus récente, en les simulant.

Par exemple, si je suis en PHP 7, je ne peux pas bénéficier des fonctionnalités présentes en PHP 8.

Mais si j’utilise le package PHP 8.0 Polyfill de Symfony, alors je pourrai utiliser des fonctions comme str_contains (référence), qui n’est apparue qu’en PHP 8.0, puisqu’un polyfill de cette fonction a été écrit dans ce composant de Symfony.