Comment crée-t-on une nouvelle route dans Symfony pour afficher une page "À propos" ?
Pour créer une route “À propos”, on utilise l’attribut #[Route] au-dessus d’une méthode de contrôleur. Il faut spécifier le chemin URL et le nom de la route.
#[Route('/a-propos', name: 'app_about')]
public function index(): Response {
return $this->render('about.html.twig');
}Comment protège-t-on une route Symfony pour qu’elle ne soit accessible qu’aux utilisateurs connectés ?
Pour restreindre l’accès, on utilise l’attribut #[IsGranted(‘ROLE_USER’)] sur la méthode ou la classe du contrôleur. On peut aussi configurer le fichier config/packages/security.yaml sous la section access_control pour lier des patterns d’URL à des rôles.
Comment affiche-t-on un message flash dans une vue Twig après une action réussie (par exemple, la création d’un élément) ?
On définit le message dans le contrôleur avec $this->addFlash(‘success’, ‘Action réussie !’);. Pour l’afficher dans Twig, on utilise la fonction app.flashes :
{% for message in app.flashes('success') %}
<div class="alert alert-success">{{ message }}</div>
{% endfor %}Comment crée-t-on une entité Doctrine pour représenter une table en base de données ?
On crée une entité via la console avec la commande symfony console make:entity. On suit ensuite les instructions pour ajouter des champs. Cela génère une classe PHP dans src/Entity avec des annotations/attributs décrivant la structure de la table.
Comment passer proprement un paramètre à une requête faite avec Doctrine ?
Il ne faut jamais injecter directement une variable dans une chaîne SQL. On utilise des paramètres nommés pour éviter les injections SQL :
$repository->createQueryBuilder('p')
->where('p.prix > :prixMin')
->setParameter('prixMin', 10)
->getQuery()->getResult();Comment applique-t-on un style CSS à un formulaire Symfony ?
Il existe trois méthodes principales :
Ajouter une classe directement dans le FormType via l’option ‘attr’ => [‘class’ => ‘ma-classe’].
Utiliser un thème de formulaire dans Twig : {% form_theme form ‘bootstrap_5_layout.html.twig’ %}.
Entourer les champs de balises HTML personnalisées dans le template Twig.
Comment crée-t-on un formulaire Symfony avec un champ de type email ?
Dans la classe de formulaire (FormType), on utilise le type EmailType importé de Symfony\Component\Form\Extension\Core\Type\EmailType.
$builder->add('email', EmailType::class);À quoi sert le fichier composer.json dans un projet Symfony ? Quel type d’information y trouve-t-on ?
Ce fichier est le cœur de la gestion des dépendances. On y trouve :
À quoi servent les services dans Symfony ?
Les services sont des objets conçus pour accomplir une tâche technique ou métier spécifique (ex: envoyer un e-mail, calculer des frais de port). Ils permettent de centraliser la logique pour qu’elle soit réutilisable partout et testable de manière isolée.
Quand on ajoute un nouveau champ à une entité Doctrine, quelles sont les étapes pour mettre à jour la base de données ?
Comment vérifie-t-on qu’un utilisateur n’a pas déjà créé un élément spécifique (par exemple, pour éviter les doublons) ? Décrivez la logique avec Doctrine.
La logique consiste à interroger le Repository de l’entité avant la création. On utilise findOneBy([‘champ’ => $valeur]).
Si la méthode renvoie un objet, le doublon est détecté et on renvoie une erreur.
On peut aussi utiliser la contrainte de validation #[UniqueEntity(‘champ’)] dans l’entité.
Comment injecter des données de tests proprement dans une base de donnée avec Symfony ?
On utilise le bundle DoctrineFixturesBundle. On crée une classe dans src/DataFixtures, on y instancie ses objets, on les “persiste” avec $manager->persist($objet) et on valide avec $manager->flush(). On lance enfin symfony console doctrine:fixtures:load.
Comment faire pour qu’un champ texte soit obligatoire et ait au moins 3 caractères dans un formulaire Symfony ?
On ajoute des attributs de validation (Assert) directement sur les propriétés de l’entité liée :
#[Assert\NotBlank] #[Assert\Length(min: 3)] private $monChamp;
Ou on utilise les constraintes dans le FormType.
Comment injecter un service dans un contrôlleur ?
On utilise l’injection de dépendances par constructeur. Symfony détecte automatiquement le type du service demandé et l’instancie pour nous (Autowiring).
public function \_\_construct(private MonService $monService) {}Décrivez l’enchainement des couches du MVC de l’affichage à la base de donnée dans un projet Symfony.
Enchaînement des couches MVC :
Décrivez, autant que possible, le mécanisme d’injection de dépendances dans Symfony.
Il repose sur le Service Container. Au démarrage, Symfony scanne toutes les classes. Quand vous demandez une interface ou une classe dans un constructeur, le Container cherche s’il possède une instance correspondante. S’il la trouve, il l’injecte. S’il ne l’a pas, il l’instancie (et instancie ses propres dépendances au passage). C’est ce qu’on appelle l’Autowiring.
Qu’apporte Symfony par rapport à du code PHP sans framework ?
Symfony apporte une structure standardisée (on ne perd pas de temps à inventer l’architecture), une sécurité native (protection CSRF, XSS, SQLi), une immense bibliothèque de composants réutilisables et une maintenance facilitée pour les projets d’envergure grâce au respect des principes SOLID.