Formation DWWM - Développement Web et Web Mobile
php -v
# Installation de Symfony CLI curl -sS https://get.symfony.com/cli/installer | bash # Création d'un nouveau projet symfony new mon_projet --version=6.4 --webapp # Démarrage du serveur de développement cd mon_projet symfony server:start
composer create-project symfony/skeleton:"6.4.*" mon_projet cd mon_projet composer require webapp
mon_projet/ ├── bin/ # Scripts exécutables ├── config/ # Configuration de l'application ├── public/ # Point d'entrée web (index.php) ├── src/ # Code source de l'application │ ├── Controller/ # Contrôleurs │ ├── Entity/ # Entités (modèles) │ └── Repository/ # Repositories ├── templates/ # Templates Twig ├── var/ # Fichiers temporaires (cache, logs) ├── vendor/ # Dépendances Composer └── composer.json # Configuration Composer
Entités
Repositories
Doctrine ORM
Logique métier
Traitement
Routing
Templates Twig
Présentation
Interface
Le contrôleur fait le lien entre le modèle et la vue
# Génération automatique php bin/console make:controller HomeController
// src/Controller/HomeController.php
<?php
namespace App\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Annotation\Route;
class HomeController extends AbstractController
{
#[Route('/', name: 'app_home')]
public function index(): Response
{
return $this->render('home/index.html.twig', [
'title' => 'Bienvenue sur mon site Symfony !',
]);
}
}
#[Route('/blog/{id}', name: 'blog_show', requirements: ['id' => '\d+'])]
public function show(int $id): Response
{
return new Response('Article numéro: ' . $id);
}
#[Route('/blog/{slug}', name: 'blog_by_slug')]
public function showBySlug(string $slug): Response
{
return new Response('Article: ' . $slug);
}
#[Route('/blog/{page}', name: 'blog_list', requirements: ['page' => '\d+'])]
public function list(int $page = 1): Response
{
return new Response('Page: ' . $page);
}
<!-- templates/base.html.twig -->
<!DOCTYPE html>
<html>
<head>
<title>{% block title %}Mon Site{% endblock %}</title>
{% block stylesheets %}{% endblock %}
</head>
<body>
{% block body %}{% endblock %}
{% block javascripts %}{% endblock %}
</body>
</html>
<!-- templates/home/index.html.twig -->
{% extends 'base.html.twig' %}
{% block title %}{{ title }}{% endblock %}
{% block body %}
<h1>{{ title }}</h1>
<p>Ceci est ma première page Symfony !</p>
{% endblock %}
# .env APP_ENV=dev APP_SECRET=your-secret-key DATABASE_URL="mysql://user:password@127.0.0.1:3306/ma_base"
# Vider le cache php bin/console cache:clear # Lister les routes php bin/console debug:router # Vérifier la configuration php bin/console debug:config # Mode debug php bin/console about
use Psr\Log\LoggerInterface;
class HomeController extends AbstractController
{
public function __construct(
private LoggerInterface $logger
) {}
#[Route('/', name: 'app_home')]
public function index(): Response
{
$this->logger->info('Page d\'accueil visitée');
return $this->render('home/index.html.twig');
}
}
Symfony injecte automatiquement les services grâce à l'autowiring
# Génération du contrôleur
php bin/console make:controller BlogController
# Structure des routes
/blog → Liste des articles
/blog/{id} → Affichage d'un article
# Installation du profiler (mode dev) composer require --dev symfony/profiler-pack # Debug d'une route spécifique php bin/console debug:router app_home
🎉 Merci pour votre attention ! 🎉