0% ont trouvé ce document utile (0 vote)
53 vues20 pages

Support Cours Synfony

Le document présente Symfony, un framework PHP open-source, en détaillant ses caractéristiques, sa structure de projet et ses fonctionnalités clés telles que la gestion des routes, le moteur de template Twig et l'ORM Doctrine. Il aborde également le modèle MVC, les avantages de cette architecture, ainsi que des exemples pratiques d'utilisation de Symfony dans des applications web. Enfin, il fournit des instructions pour l'installation et la gestion des formulaires dans Symfony.

Transféré par

dossoujeanjacques22
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
53 vues20 pages

Support Cours Synfony

Le document présente Symfony, un framework PHP open-source, en détaillant ses caractéristiques, sa structure de projet et ses fonctionnalités clés telles que la gestion des routes, le moteur de template Twig et l'ORM Doctrine. Il aborde également le modèle MVC, les avantages de cette architecture, ainsi que des exemples pratiques d'utilisation de Symfony dans des applications web. Enfin, il fournit des instructions pour l'installation et la gestion des formulaires dans Symfony.

Transféré par

dossoujeanjacques22
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

GAZA FORMATION

PROGRAMMATION WEB : SYNFONY


LICENCE 3 SIL

Introduction à Symfony

I- Présentation du framework Symfony


1. Qu'est-ce que Symfony ?
• Symfony est un framework PHP open-source pour le développement
d’applications web et d’API.
• Créé par Fabien Potencier en 2005, il est maintenu par la société française
SensioLabs et une communauté active.
• Symfony est reconnu pour sa modularité, sa flexibilité et son respect des
standards.

2. Caractéristiques principales
a) Architecture MVC (Model-View-Controller)
• Séparation des responsabilités :
o Model : Gestion des données et de la logique métier.
o View : Interface utilisateur.
o Controller : Point d’entrée qui gère les requêtes et coordonne le Model
et la View.
b) Modulaire
• Utilisation de composants indépendants (e.g., Router, Form, Security).
• Ces composants peuvent être utilisés en dehors du framework principal.
c) Performance et Robustesse
• Optimisé pour les grandes applications.
• Offre des outils pour gérer la performance : cache, profiling, etc.
d) Respect des standards
• Utilise des standards modernes comme PSR (PHP Standards
Recommendations).

Présenté par : Francky S. Jules C. B. ADEOSSI


• Compatible avec d'autres librairies et frameworks.

3. Pourquoi choisir Symfony ?


Avantages :
• Réputation : Utilisé par des entreprises et projets de grande envergure.
• Ecosystème riche : Documentation, bundles prêts à l’emploi, et communauté
active.
• Sécurité : Gestion robuste des utilisateurs, des droits et des sessions.
• Tests intégrés : Intégration de PHPUnit pour écrire des tests automatisés.
Limites :
• Courbe d’apprentissage : Peut être complexe pour les débutants.
• Performance initiale : Moins rapide pour les petites applications (par rapport à
des micro-frameworks comme Lumen).

II- Structure d’un projet Symfony


Un projet Symfony suit une structure organisée pour faciliter la maintenance :
my_project/

├── config/ # Fichiers de configuration (services, routes, etc.)
├── src/ # Code source de l’application
│ ├── Controller/ # Contrôleurs (logique applicative)
│ ├── Entity/ # Entités liées à la base de données
│ └── Repository/ # Gestion des données
├── templates/ # Vues Twig
├── public/ # Point d’entrée (index.php) et fichiers publics
├── var/ # Cache et logs
└── vendor/ # Dépendances gérées par Composer

Présenté par : Francky S. Jules C. B. ADEOSSI


5. Fonctionnalités clés
a) Gestion des routes
• Le composant Router associe des URL à des contrôleurs.
• Exemple de route :
#[Route('/home', name: 'home')]
public function home(): Response {
return new Response('Bienvenue sur Symfony!');
}
b) Twig (moteur de template)
• Syntaxe simple pour générer des pages web dynamiquement.
• Exemple :
<h1>{{ title }}</h1>
<p>Bienvenue, {{ user.name }}!</p>
c) ORM Doctrine
• Gère les interactions avec la base de données.
• Exemple : Requête pour trouver un utilisateur.
$user = $this->getDoctrine()->getRepository(User::class)->find(1);
d) Sécurité
• Authentification et autorisation intégrées.
• Gestion des utilisateurs avec un système de rôles.

6. Cas d’usage typiques


• Applications complexes : Gestionnaires de contenu (CMS), ERP, etc.
• API REST : Applications mobiles ou front-end modernes.
• E-commerce : Plates-formes robustes et scalables.

Présenté par : Francky S. Jules C. B. ADEOSSI


7. Projets célèbres utilisant Symfony
• Drupal : CMS populaire.
• Prestashop : Plateforme d’e-commerce.
• BlaBlaCar : Site de covoiturage.

III- Installation rapide


Prérequis :
• PHP 8.1+ (recommandé), Composer, un serveur web (Apache/Nginx).
Commandes d’installation :
1. Installer Symfony CLI :
curl -sS https://get.symfony.com/cli/installer | bash
2. Créer un nouveau projet :
symfony new my_project --webapp
3. Démarrer le serveur local :
symfony server:start

Architecture MVC et Routage


I- Rappel du modèle MVC
1. Définition du Modèle MVC
Le modèle MVC est une architecture logicielle qui sépare une application en trois
composants principaux :
• Model (Modèle) : Gère les données et la logique métier.
• View (Vue) : Affiche les données à l'utilisateur.
• Controller (Contrôleur) : Sert de médiateur entre le modèle et la vue.
Objectif principal :
Séparer les responsabilités pour rendre l'application plus modulaire, maintenable et
testable.

Présenté par : Francky S. Jules C. B. ADEOSSI


2. Rôles des composants
a) Model (Modèle)
• Responsable de la gestion des données et de la logique métier.
• Interagit avec la base de données (CRUD).
• Ne contient aucune information sur l’interface utilisateur.
Exemple (Symfony - Doctrine Entity) :
// src/Entity/Product.php
class Product {
private $id;
private $name;
private $price;

public function getName(): string {


return $this->name;
}
// Autres getters et setters...
}

b) View (Vue)
• Représente l’interface utilisateur.
• Présente les données fournies par le modèle de manière compréhensible.
• Ne contient pas de logique métier, uniquement des éléments visuels.
Exemple (Symfony - Twig Template) :
<!-- templates/product/show.html.twig -->
<h1>{{ product.name }}</h1>
<p>Prix : {{ product.price }} €</p>

Présenté par : Francky S. Jules C. B. ADEOSSI


c) Controller (Contrôleur)
• Agit comme un pont entre le modèle et la vue.
• Reçoit les requêtes utilisateur, interagit avec le modèle et sélectionne la vue à
afficher.
Exemple (Symfony - Controller) :
// src/Controller/ProductController.php
class ProductController extends AbstractController {
#[Route('/product/{id}', name: 'product_show')]
public function show($id, ProductRepository $repository): Response {
$product = $repository->find($id);
return $this->render('product/show.html.twig', ['product' => $product]);
}
}

3. Diagramme MVC
Utilisateur


Controller ←→ Model
│ ▲
▼ │
View ←──────┘
1. L'utilisateur interagit avec l'interface (exemple : clique sur un bouton).
2. Le contrôleur traite la requête et demande au modèle les données
nécessaires.
3. Le modèle fournit les données demandées.
4. Le contrôleur envoie ces données à la vue.
5. La vue affiche le résultat à l'utilisateur.

Présenté par : Francky S. Jules C. B. ADEOSSI


4. Avantages du Modèle MVC
• Séparation des responsabilités : Facilite la maintenance et la réutilisation du
code.
• Extensibilité : Les modifications dans une couche (ex. interface utilisateur)
n'affectent pas les autres.
• Travail en équipe : Les développeurs peuvent travailler indépendamment sur
le modèle, la vue et le contrôleur.

5. Exemple concret
Cas d’usage : Une application de gestion de produits
1. Utilisateur : Souhaite afficher un produit spécifique.
2. Controller : Intercepte la requête /product/{id}, récupère le produit depuis le
Model.
3. Model : Fournit les informations sur le produit depuis la base de données.
4. View : Affiche les détails du produit (nom, prix, description).

II- Le composant Router de Symfony


Le Router est un composant clé de Symfony qui gère :
• L'association des URL à des actions spécifiques (contrôleurs).
• La génération d'URL à partir de noms de routes et de paramètres.
Le Router repose sur le fichier de configuration des routes et permet :
• De définir des routes statiques ou dynamiques.
• De valider les paramètres dans les URL.
• De rendre les URL lisibles et conviviales.
Rôles principaux du Router :
✓ Faire correspondre une requête entrante à une route définie.
✓ Fournir des URL dynamiques pour la navigation.

Présenté par : Francky S. Jules C. B. ADEOSSI


1. Le composant Router de Symfony
Le Router est un composant clé de Symfony qui gère :
• L'association des URL à des actions spécifiques (contrôleurs).
• La génération d'URL à partir de noms de routes et de paramètres.
Le Router repose sur le fichier de configuration des routes et permet :
• De définir des routes statiques ou dynamiques.
• De valider les paramètres dans les URL.
• De rendre les URL lisibles et conviviales.
Rôles principaux du Router :
✓ Faire correspondre une requête entrante à une route définie.
✓ Fournir des URL dynamiques pour la navigation.

2. Création et gestion des routes


a) Définir une route dans Symfony
Symfony permet de définir des routes de plusieurs façons :
1) Annotations (méthode courante)
• Les annotations sont directement ajoutées dans les contrôleurs.
• Utilisation de la classe #[Route()].

// src/Controller/ProductController.php
use Symfony\Component\Routing\Annotation\Route;

class ProductController extends AbstractController {


#[Route('/product', name: 'product_index')]
public function index(): Response {
return new Response('Liste des produits');
}
}
Présenté par : Francky S. Jules C. B. ADEOSSI
▪ URL associée : /product
▪ Nom de la route : product_index
▪ Méthode : GET (par défaut)

2) Configuration YAML
Les routes peuvent être définies dans un fichier YAML (par défaut :
config/routes.yaml).
product_index:
path: /product
controller: App\Controller\ProductController::index

3) Configuration XML
Les routes peuvent également être définies dans un fichier XML.
<route id="product_index" path="/product">
<default key="_controller">App\Controller\ProductController::index</default>
</route>

4) Fichiers PHP
Les routes peuvent être définies dans des fichiers PHP pour un contrôle
programmatique.
use Symfony\Component\Routing\RouteCollection;
use Symfony\Component\Routing\Route;

$routes = new RouteCollection();


$routes->add('product_index', new Route('/product', [
'_controller' => 'App\Controller\ProductController::index',
]));

Présenté par : Francky S. Jules C. B. ADEOSSI


b) Gestion des routes
• Les routes sont accessibles via leur nom dans le code et dans les templates.
• Exemple d’appel depuis un template Twig :
<a href="{{ path('product_index') }}">Voir les produits</a>

Pour afficher toutes les routes configurées :


php bin/console debug:router

3. Paramètres dynamiques dans les URL

Les routes peuvent inclure des paramètres dynamiques pour rendre les URL flexibles.
a) Paramètres simples
Un paramètre est défini dans l'URL avec {}.
#[Route('/product/{id}', name: 'product_show')]
public function show($id): Response {
return new Response('Produit ID : ' . $id);
}
- URL : /product/42
- $id contiendra 42.

b) Paramètres avec valeurs par défaut


Vous pouvez définir une valeur par défaut pour un paramètre.
#[Route('/product/{id}', name: 'product_show', defaults: ['id' => 1])] public function
show($id): Response { return new Response('Produit ID : ' . $id); }

URL : /product → $id = 1.

Présenté par : Francky S. Jules C. B. ADEOSSI


c) Validation des paramètres (Expression régulière)
Pour restreindre les valeurs possibles d’un paramètre, utilisez des contraintes.
#[Route('/product/{id}', name: 'product_show', requirements: ['id' => '\d+'])]
public function show($id): Response {
return new Response('Produit ID : ' . $id);
}
requirements: ['id' => '\d+'] : Le paramètre doit être un nombre entier.

d) Paramètres optionnels
Les paramètres peuvent être rendus facultatifs en leur attribuant une valeur par
défaut.
#[Route('/product/{id}/{slug}', name: 'product_detail', defaults: ['slug' => 'default-
slug'])]
public function detail($id, $slug): Response {
return new Response('ID : ' . $id . ', Slug : ' . $slug);
}
URL : /product/42 → $slug = 'default-slug'

4. Génération d'URL
Pour générer des URL dynamiquement (exemple : dans les templates ou le code PHP),
utilisez le nom de la route avec des paramètres :
a) Twig
<a href="{{ path('product_show', { 'id': 42 }) }}">Voir le produit</a>

b) PHP
$url = $this->generateUrl('product_show', ['id' => 42]);

Présenté par : Francky S. Jules C. B. ADEOSSI


Gestion des formulaires
1. Création de formulaires avec Symfony
Le composant Form de Symfony facilite la création, la gestion et la validation des
formulaires.
a) Structure de base d’un formulaire
Un formulaire Symfony se compose de :
• Une classe de formulaire (définit les champs et leurs propriétés).
• Un contrôleur (gère la logique du formulaire).
• Une vue Twig (affiche le formulaire).

b) Étapes pour créer un formulaire


▪ Créer une classe de formulaire
Générer une classe avec la commande :
php bin/console make:form
Exemple de classe ContactType :
// src/Form/ContactType.php
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\TextareaType;

class ContactType extends AbstractType {


public function buildForm(FormBuilderInterface $builder, array $options): void {
$builder
->add('name', TextType::class, ['label' => 'Nom'])
->add('email', EmailType::class, ['label' => 'Email'])
->add('message', TextareaType::class, ['label' => 'Message']);
}
Présenté par : Francky S. Jules C. B. ADEOSSI
}

2. Gérer le formulaire dans un contrôleur


Le formulaire est instancié, traité, et validé dans le contrôleur.
// src/Controller/ContactController.php
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;

class ContactController extends AbstractController {


#[Route('/contact', name: 'contact')]
public function index(Request $request): Response {
$form = $this->createForm(ContactType::class);

$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
// Traitement des données du formulaire
$data = $form->getData();
// Exemple : envoi d'email ou sauvegarde en base
$this->addFlash('success', 'Votre message a été envoyé avec succès!');
return $this->redirectToRoute('contact');
}

return $this->render('contact/index.html.twig', [
'form' => $form->createView(),
]);
}
}
▪ Afficher le formulaire dans Twig
Présenté par : Francky S. Jules C. B. ADEOSSI
Symfony génère automatiquement le HTML du formulaire.
<!-- templates/contact/index.html.twig -->
{{ form_start(form) }}
{{ form_widget(form) }}
<button type="submit">Envoyer</button>
{{ form_end(form) }}

2. Validation des données de formulaire


Symfony utilise le composant Validator pour valider les données.
a) Ajouter des contraintes dans l’entité
Les contraintes sont définies directement dans l’entité associée.
// src/Entity/Contact.php
use Symfony\Component\Validator\Constraints as Assert;

class Contact {
#[Assert\NotBlank(message: 'Le nom est obligatoire.')]
private $name;

#[Assert\Email(message: 'Veuillez saisir un email valide.')]


private $email;

#[Assert\Length(
min: 10,
minMessage: 'Le message doit contenir au moins {{ limit }} caractères.'
)]
private $message;
}

Présenté par : Francky S. Jules C. B. ADEOSSI


b) Validation automatique
Lorsque le formulaire est soumis, Symfony applique automatiquement les contraintes
définies dans l’entité.

3. Gestion des erreurs et messages de succès


a) Afficher les erreurs dans Twig
Les erreurs associées aux champs sont accessibles via le formulaire.
{{ form_start(form) }}
<div>
{{ form_label(form.name) }}
{{ form_widget(form.name) }}
{{ form_errors(form.name) }} <!-- Affiche les erreurs pour ce champ -->
</div>
<div>
{{ form_label(form.email) }}
{{ form_widget(form.email) }}
{{ form_errors(form.email) }}
</div>
<button type="submit">Envoyer</button>
{{ form_end(form) }}

b) Messages de succès ou d'erreur global


Utilisez le FlashBag pour afficher des messages temporaires.
Dans le contrôleur :
$this->addFlash('success', 'Votre formulaire a été soumis avec succès!');
$this->addFlash('error', 'Une erreur est survenue lors de l’envoi.');

Dans Twig :
{% for label, messages in app.flashes %}
Présenté par : Francky S. Jules C. B. ADEOSSI
<div class="alert alert-{{ label }}">
{% for message in messages %}
<p>{{ message }}</p>
{% endfor %}
</div>
{% endfor %}

Interaction avec la base de données (Doctrine)


1. Introduction à Doctrine (ORM de Symfony)
Doctrine est un ORM (Object Relational Mapper) utilisé dans Symfony pour :
• Mapper les bases de données relationnelles à des objets PHP.
• Gérer automatiquement les interactions avec la base de données (CRUD).
Principaux avantages :
• Abstraction de la base de données (SQL n'est pas toujours nécessaire).
• Gestion automatique des relations entre tables.
• Portabilité entre différents systèmes de gestion de bases de données (MySQL,
PostgreSQL, SQLite, etc.).
2. Configuration d’une base de données
a) Configurer la connexion à la base de données
La configuration se fait dans le fichier .env.
Exemple pour une base MySQL :
DATABASE_URL="mysql://user:[email protected]:3306/database_name"

b) Vérifier la connexion
Testez la connexion avec la commande :
php bin/console doctrine:database:create

Présenté par : Francky S. Jules C. B. ADEOSSI


3. Création d’entités et migrations
a) Création d’une entité
Une entité représente une table dans la base de données.
1. Générer une entité :
php bin/console make:entity
Exemple : Entité Product
// src/Entity/Product.php
namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
class Product {
#[ORM\Id]
#[ORM\GeneratedValue]
#[ORM\Column(type: 'integer')]
private $id;

#[ORM\Column(type: 'string', length: 255)]


private $name;

#[ORM\Column(type: 'decimal', precision: 10, scale: 2)]


private $price;

// Getters et Setters...
}
b) Création d’une migration
Les migrations permettent de synchroniser vos entités avec la base de données.
▪ Générer une migration :
Présenté par : Francky S. Jules C. B. ADEOSSI
php bin/console make:migration
▪ Appliquer la migration à la base :
php bin/console doctrine:migrations:migrate

4. Opérations CRUD avec Doctrine


Doctrine offre une méthode simple pour effectuer des opérations CRUD (Create,
Read, Update, Delete).
a) Insertion d’un nouvel enregistrement (Create)
Exemple d'ajout d'un produit dans un contrôleur :
// src/Controller/ProductController.php
use App\Entity\Product;
use Doctrine\ORM\EntityManagerInterface;

public function createProduct(EntityManagerInterface $em): Response {


$product = new Product();
$product->setName('Produit A');
$product->setPrice(19.99);

$em->persist($product); // Prépare l'insertion


$em->flush(); // Exécute l’insertion

return new Response('Produit ajouté avec ID : ' . $product->getId());


}
b) Lecture des données (Read)
1. Utilisation du Repository pour récupérer les données.
Exemple : Récupérer tous les produits.
use App\Repository\ProductRepository;

public function listProducts(ProductRepository $repository): Response {


Présenté par : Francky S. Jules C. B. ADEOSSI
$products = $repository->findAll();
return $this->render('product/list.html.twig', ['products' => $products]);
}

2. Méthodes utiles du Repository :


o find($id) : Trouve un enregistrement par son ID.
o findAll() : Retourne tous les enregistrements.
o findBy([...]) : Trouve des enregistrements selon des critères.
o findOneBy([...]) : Trouve un seul enregistrement selon des critères.

c) Mise à jour des données (Update)


Pour mettre à jour un enregistrement :
public function updateProduct(EntityManagerInterface $em, ProductRepository
$repository, $id): Response {
$product = $repository->find($id);
if (!$product) {
throw $this->createNotFoundException('Produit non trouvé.');
}

$product->setPrice(29.99);
$em->flush(); // Applique les modifications

return new Response('Produit mis à jour.');


}

d) Suppression d’un enregistrement (Delete)


Pour supprimer un produit :
public function deleteProduct(EntityManagerInterface $em, ProductRepository
$repository, $id): Response {

Présenté par : Francky S. Jules C. B. ADEOSSI


$product = $repository->find($id);
if (!$product) {
throw $this->createNotFoundException('Produit non trouvé.');
}

$em->remove($product); // Prépare la suppression


$em->flush(); // Exécute la suppression

return new Response('Produit supprimé.');


}

Présenté par : Francky S. Jules C. B. ADEOSSI

Vous aimerez peut-être aussi