Académique Documents
Professionnel Documents
Culture Documents
Symfony est un framework d'applications Web PHP open-source, conçu pour les
développeurs qui ont besoin d'une boîte à outils simple et élégante pour créer des
applications Web complètes.
Symfony est sponsorisé par SensioLabs. Il a été développé par Fabien Potencier en
2005.
Public
Ce tutoriel a été préparé pour les débutants qui souhaitent apprendre les concepts
fondamentaux du framework Symfony. Les lecteurs comprendront suffisamment
comment créer et développer un site Web à l'aide de Symfony.
Conditions préalables
Avant de passer aux différents types de composants donnés dans ce didacticiel, il est
supposé que les lecteurs sont déjà conscients de ce qu'est un Framework. En plus de
cela, il sera également très utile si vous avez une bonne connaissance des concepts
HTML, PHP.
Symfony - Présentation
Un framework web PHP est un ensemble de classes qui aide à développer une
application web.
Symfony est un framework MVC open-source pour développer rapidement des
applications web modernes.
Vous pouvez utiliser n'importe quel composant Symfony dans les applications,
indépendamment du framework.
La structure bien organisée de Symfony, son code propre et ses bonnes pratiques de
programmation facilitent le développement Web.
Symfony est très flexible, utilisé pour créer des micro-sites et gérer des applications
d'entreprise avec des milliards de connexions.
Framework Symfony - Fonctionnalités
Les composants Symfony peuvent être utilisés dans le cadre d'autres applications telles
que Drupal, Laravel, phpBB, Behat, Doctrine et Joomla.
Dailymotion − Dailymotion est l'un des plus grands sites Web indépendants de
divertissement vidéo au monde basé en France.
Une fois qu'ils ont décidé de migrer le framework open source avec une large
communauté, les développeurs de Dailymotion ont décidé d'utiliser les fonctionnalités
des composants Symfony pour sa flexibilité.
Symfony-Installation
Vous avez deux méthodes pour créer des applications dans le framework Symfony. La
première méthode consiste à utiliser Symfony Installer, une application pour créer un
projet dans le framework Symfony.
Configuration requise
• WAMP (Windows)
• LAMP (Linux)
• XAMP (Multi-platform)
• MAMP (Macintosh)
• Nginx (Multi-platform)
• Microsoft IIS (Windows)
• PHP built-in development web server (Multi-platform)
Symfony Installer est utilisé pour créer des applications Web dans le framework
Symfony. Maintenant, configurons le programme d'installation de Symfony à l'aide de
la commande suivante.
La syntaxe suivante est utilisée pour créer une application Symfony dans la dernière
version.
Syntaxe
Ici, app_name est le nouveau nom de votre application. Vous pouvez spécifier le nom
de votre choix.
Exemple
Vous pouvez créer des applications Symfony en utilisant Composer. vous devez
installé le compositeur sur votre machine.
Si le compositeur n'est pas installé, téléchargez-le et installez-le.
Si vous devez spécifier une version spécifique, vous pouvez le spécifier dans la
commande ci-dessus.
Exécution de l'application
Après avoir exécuté la commande ci-dessus, ouvrez votre navigateur et demandez l'url
http://localhost:8000/. Il produit le résultat suivant.
Symfony-Architecture
Les composants sont une collection de classes fournissant une fonctionnalité de base
unique.
Par exemple, le composant Cache fournit une fonctionnalité de cache, qui peut être
ajoutée à n'importe quelle application.
Les composants sont des blocs de construction d'une application Symfony.
Symfony a plus de 30 composants de haute qualité, qui sont utilisés dans de
nombreux frameworks PHP tels que Laravel, Silex, etc.
En fait, une application Symfony est elle-même un bundle composé d'autres bundles.
Un seul bundle peut utiliser n'importe quel nombre de composants Symfony ainsi que
des composants tiers pour fournir des fonctionnalités telles que Webframework, l'accès
à la base de données, etc.
Le framework Web principal de Symfony est un bundle appelé FrameworkBundle et il
existe un bundle appelé FrameworkExtraBundle, qui fournit des options plus
sophistiquées pour écrire une application web.
La relation entre les composants, les bundles et l'application Symfony est spécifiée
dans le diagramme suivant.
Framework Web
Symfony est principalement conçu pour écrire des applications Web de haute qualité
avec une relative facilité.
Il fournit diverses options pour écrire différents types d'applications Web, du simple
site Web aux services Web avancés basés sur REST.
Symfony fournit un framework Web sous forme de bundles séparés.
Les bundles communs utilisés dans le framework Web Symfony sont les suivants -
FrameworkBundle
FrameworkExtraBundle
DoctrineBundle
Le framework Web Symfony fournit toutes les fonctionnalités de haut niveau requises
pour une application de niveau entreprise.
Voici un flux de travail simple de l'application Web Symfony.
Étape 6 - Le contrôleur interagira avec Model, qui à son tour interagit avec
Datasource via Doctrine ORM.
Étape 7 - Une fois que le contrôleur a terminé le processus, il génère la réponse lui-
même ou via View Engine, et la renvoie au serveur Web.
Étape 8 - Enfin, la réponse sera envoyée au navigateur demandé par le serveur Web.
Symfony – Composants
Comme indiqué précédemment, les composants Symfony sont une bibliothèque PHP
autonome fournissant une fonctionnalité spécifique, qui peut être utilisée dans
n'importe quelle application PHP.
La commande générique suivante peut être utilisée pour installer n'importe quel
composant Symfony.
cd /path/to/project/dir
composer require symfony/<component_name>
Créons une application php simple et essayons d'installer le composant Filesystem.
cd /path/to/dev/folder
mdkir filesystem-example
cd filesystem-example
<?php
require_once __DIR__ . '/vendor/autoload.php';
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Filesystem\Exception\IOExceptionInterface;
La première ligne est très importante, elle charge toutes les classes nécessaires de
tous les composants installés à l'aide de la commande Composer.
php main.php
Détails des composants Symfony
Système de fichiers
Le composant de système de fichiers fournit une commande système de base liée aux
fichiers et aux répertoires tels que la création de fichiers, la création de dossiers,
l'existence de fichiers, etc.
Le composant de système de fichiers peut être installé à l'aide de la commande
suivante.
Finder
Le composant Finder fournit des classes fluides pour rechercher des fichiers et des
répertoires dans un chemin spécifié. Il fournit un moyen facile d'itérer sur les fichiers
d'un chemin. Le composant Finder peut être installé à l'aide de la commande
suivante.
Console
Le composant Console fournit diverses options pour créer facilement des commandes
pouvant être exécutées dans un terminal.
Symfony utilise largement le composant Command pour fournir diverses
fonctionnalités telles que la création d'une nouvelle application, la création d'un
bundle, etc.
Même le serveur Web PHP intégré peut être appelé à l'aide de la commande
Symfony, php bin/console server:run comme indiqué dans la section d'installation.
<?php
La classe d'application configure les fonctionnalités nécessaires d'une application de console simple.
Console Tool
Usage:
command [options] [arguments]
Options:
-h, --help Display this help message
-q, --quiet Do not output any message
-V, --version Display this application version
--ansi Force ANSI output
--no-ansi Disable ANSI output
-n, --no-interaction Do not ask any interactive question
-v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output,
2 for more verbose output and 3 for debug
Available commands:
help Displays help for a command
list Lists commands
Étape 4 - Créez une classe appelée HelloCommand étendant la classe Command dans
le main.php lui-même.
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
étape 8 - Utilisez InputArgument pour obtenir les détails de l'utilisateur saisis par
l'utilisateur et imprimez-les sur la console à l'aide de OutputArgument.
$app->add(new HelloCommand());
<?php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Component\Console\Application;
use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Input\InputArgument;
Symfony est livré avec un binaire pré-construit appelé console dans le répertoire bin
de n'importe quelle application Web Symfony, qui peut être utilisé pour invoquer les
commandes dans une application.
Processus
PropertyAccess
Le composant PropertyAccess fournit diverses options pour lire et écrire les détails d'un objet et d'un
tableau à l'aide de la notation de chaîne(string).
Par exemple, un tableau Product avec la clé price est accessible dynamiquement à l'aide de la chaîne
[price]([price] string).
$product = array(
'name' => 'Cake'
'price' => 10
);
var priceObj = $propertyAccesserObj->getValue($product, '[price]');
InfoPropriété(PropertyInfo)
class Product {
private $name = 'Cake';
private $price = 10;
$class = Product::class;
$properties = $propertyInfoObj->getProperties($class);
/*
Example Result
--------------
array(2) {
[0] => string(4) "name"
[1] => string(5) "price"
}
*/
Répartiteur d'événements(EventDispatcher)
Nous apprendrons comment créer des événements et les écouter dans le chapitre
Événements et Event Listener.
DépendanceInjection(DependencyInjection)
Sérialiseur(Serializer)
Le composant Serializer fournit une option pour convertir un objet PHP dans un
format spécifique tel que XML, JSON, Binary, etc., puis lui permet de le reconvertir
en un objet original sans aucune perte de données.
Configuration
Le composant Config fournit des options pour charger, analyser, lire et valider les
configurations de type XML, YAML, PHP et ini.
Il fournit également diverses options pour charger les détails de configuration à partir
de la base de données.
C'est l'un des composants importants utiles pour configurer l'application Web de
manière claire et concise.
Le composant de configuration peut être installé à l'aide de la commande suivante.
OptionsRésolveur(OptionsResolver)
Par exemple, le paramètre de base de données est placé dans un tableau, dboption
avec hôte, nom d'utilisateur, mot de passe, etc., en tant que clés.
Vous devez valider les entrées avant de l'utiliser pour vous connecter à la base de
données.
Dotenv
Le composant Dotenv fournit diverses options pour analyser les fichiers .env et la
variable définie dans ceux-ci pour être accessible via getenv(), $_ENV ou $_SERVER.
Le composant Dotenv peut être installé à l'aide de la commande suivante.
Cache
Il peut être utilisé pour ajouter une fonctionnalité de cache à notre application
Web. Puisqu'il suit PSR-6, il est facile de démarrer et il peut être facilement utilisé à
la place d'un autre composant de cache basé sur PSR-6.
International(Intl)
Normalement, les détails de traduction des différentes langues seront stockés dans
un fichier, un fichier par langue, et il sera chargé dynamiquement pendant
l'exécution de l'application.
Flux de travail(Workflow)
Le composant Workflow fournit des outils avancés pour traiter une machine à états
finis.
Le composant Yaml fournit une option qui analyse le format de fichier YAML et le
convertit en tableaux PHP. Il est également capable d'écrire un fichier YAML à partir
d'un tableau php simple. Le composant Yaml peut être installé à l'aide de la
commande suivante.
LDAP
Le composant LDAP fournit des classes PHP pour se connecter à un serveur LDAP ou
Active Directory et authentifier l'utilisateur par rapport à celui-ci.
Déboguer
Le composant Stopwatch fournit la classe Stopwatch pour profiler notre code PHP.
VarDumper
Le composant VarDumper fournit une meilleure fonction dump().
Kit de navigateur
Par exemple, il peut demander un formulaire, entrer les exemples de données et les
soumettre pour trouver tout problème dans le formulaire par programmation.
Actif(Asset)
Le composant Asset fournit une gestion générique des actifs dans une application
Web.
Il génère des URL pour les actifs tels que CSS, HTML, JavaScript et effectue
également la maintenance des versions.
CssSelector
Le composant CssSelector fournit une option pour convertir les sélecteurs basés sur
CSS en expression XPath.
Un développeur Web connaît mieux l'expression des sélecteurs basés sur CSS que
l'expression XPath, mais l'expression la plus efficace pour trouver un élément dans un
document HTML et XML est l'expression XPath.
DomCrawler
Form
Le composant de formulaire permet de créer facilement un formulaire dans une
application Web. Nous apprendrons la programmation de formulaires en détail dans
le chapitre Formulaire.
HttpKernel
Routage(Routing)
Le routage décide quelle partie de notre application doit gérer une requête.
Modèles(Templating)
Validateur(Validator)
Le composant Validator fournit une implémentation de la spécification de validation
de bean JSR-303.
Il peut être utilisé pour valider un formulaire dans un environnement Web. Nous en
apprendrons plus sur Validator dans le chapitre Validation.
Sécurité
Dans toute application, les objets ont tendance à augmenter à mesure que
l'application grandit.
À mesure que les objets augmentent, la dépendance entre les objets augmente
également.
La dépendance d'objet doit être gérée correctement pour une application réussie.
Le but de la classe Greeter est de saluer l'utilisateur comme illustré dans l'exemple
suivant.
Une fois le conteneur créé, la classe Greeter peut y être enregistrée à l'aide de la
méthode register du conteneur.
use Symfony\Component\DependencyInjection\ContainerBuilder;
$container = new ContainerBuilder();
$container
->register('greeter', 'Greeter')
->addArgument('Hi');
Ici, nous avons utilisé un argument statique pour spécifier le texte de salutation,
Salut.
$greeter = $container->get('greeter');
$greeter->greet('Jon'); // prints "Hi, Jon"
Nous avons enregistré avec succès une classe, Greeter dans le conteneur, l'avons
extraite du conteneur et l'avons utilisée.
Maintenant, créons une autre classe User, qui utilise la classe Greeter et voyons
comment l'enregistrer.
class User {
private $greeter;
public $name;
public $age;
La classe User obtient la classe Greeter en utilisant l'une de ses méthodes setter,
setGreeter.
Enfin, nous avons enregistré deux classes, Greeter et User ayant une relation forte
entre elles.
Maintenant, nous pouvons récupérer en toute sécurité l'objet User avec la classe
Greeter correctement configurée à partir du conteneur, comme indiqué dans le code
suivant.
$container->setParameter('greeter.text', 'Hi');
$user = $container->get('user');
$user->name = "Jon";
$user->age = 20;
$user->greet(); // Prints "Hi, Jon"
Nous avons vu comment configurer un objet dans un conteneur en utilisant PHP lui-
même.
prestations de service.
Enfin, les appels spécifient les méthodes de définition. Une autre classe peut être
référencée en utilisant le symbole @,
@greeter.
parameters:
greeter.text: 'Hello'
services:
greeter:
class: Greeter
arguments: ['%greeter.text%']
user:
class: User
calls:
- [setGreeter, ['@greeter']]
use Symfony\Component\Config\FileLocator;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
$yamlUser = $yamlContainer->get('user');
$yamlUser->name = "Jon";
$yamlUser->age = 25;
$yamlUser->greet();
class Greeter {
private $greetingText;
$container->setParameter('greeter.text', 'Hi');
$greeter = $container->get('greeter');
$greeter->greet('Jon');
$user = $container->get('user');
$user->name = "Jon";
$user->age = 20;
$user->greet();
$yamlUser = $yamlContainer->get('user');
$yamlUser->name = "Jon";
$yamlUser->age = 25;
$yamlUser->greet();
?>
services.yml
parameters:
greeter.text: 'Hello'
services:
greeter:
class: Greeter
arguments: ['%greeter.text%']
user:
class: User
calls:
- [setGreeter, ['@greeter']]
Le framework Web Symfony expose le conteneur dans tous ses contrôleurs via la
propriété conteneur.
Nous pouvons y faire enregistrer tous les objets, par exemple logger, mailer, etc.
$logger = $this->container->get('logger');
$logger->info('Hi');
Symfony fournit une programmation basée sur les événements via son composant
EventDispatcher.
Toute application d'entreprise a besoin d'une programmation basée sur les événements
pour créer une application hautement personnalisable.
Les événements sont l'un des principaux outils permettant aux objets d'interagir les
uns avec les autres.
Le processus de programmation basée sur les événements peut être résumé comme
suit : - Un objet, appelé source d'événement, demande à l'objet répartiteur central
d'enregistrer un événement, par exemple user.registered.
Le répartiteur central informe tous les objets d'écoute de l'événement, par exemple
user.registered et son objet Event*.
Dans la programmation basée sur les événements, nous avons quatre types d'objets :
la source d'événement, l'écouteur d'événement, le répartiteur pair et l'événement lui-
même.
Écrivons une application simple pour comprendre le concept.
class User {
public $name;
public $age;
}
use Symfony\Component\EventDispatcher\Event;
class UserRegisteredEvent extends Event {
const NAME = 'user.registered';
protected $user;
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
array($listener, 'onUserRegistrationAction'));
$dispatcher
->addListener(
UserRegisteredEvent::NAME,
function(Event $event) {
$user = $event->getUser();
echo $user->name . "\r\n";
});
$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);
La liste complète des codes est la suivante.
main.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Component\EventDispatcher\EventDispatcher;
use Symfony\Component\EventDispatcher\Event;
class User {
public $name;
public $age;
}
class UserRegisteredEvent extends Event {
const NAME = 'user.registered';
protected $user;
function(Event $event) {
$user = $event->getUser();
echo $user->name . "\r\n";
});
$dispatcher
->addListener(
UserRegisteredEvent::NAME, array($listener, 'onUserRegistrationAction'));
$dispatcher->dispatch(UserRegisteredEvent::NAME, $event);
?>
Résultat
Jon
Jon
25
Symfony-Expression
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
Étape 4 - L'expression Symfony est puissante,de sorte qu'elle peut intercepter un objet PHP et sa
propriété également dans le langage d'expression.
class Product {
public $name;
public $price;
}
$product = new Product();
$product->name = 'Cake';
$product->price = 10;
Ici, les expressions product.price et product.price > 5 interceptent le prix de la propriété de l'objet
$product et évaluent le résultat.
main.php
<?php
require __DIR__ . '/vendor/autoload.php';
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
$language = new ExpressionLanguage();
class Product {
public $name;
public $price;
}
$product = new Product();
$product->name = 'Cake';
$product->price = 10;
Résultat
Evaluated Value: 22
Compiled Code: (130 % 34)
Product price is 10
Is Product price higher than 5: 1
Symfony - Offres groupées
Un bundle Symfony est une collection de fichiers et de dossiers organisés dans une structure
spécifique.
Les bundles sont modélisés de manière à pouvoir être réutilisés dans de multiples applications.
L'application principale elle-même est conditionnée sous forme de bundle et est généralement appelée
AppBundle.
Un bundle peut être packagé spécifiquement pour une application telle que AdminBundle (section
admin), BlogBundle (blog du site), etc.
Au lieu de cela, nous pouvons modéliser une certaine partie de l'application, telle que les blogs, en
tant que bundle générique afin que nous puissions simplement copier le bundle d'une application à une
autre application pour réutiliser la fonctionnalité de blog.
Ressources/public − Les feuilles de style liées au bundle, les JavaScripts, les images, etc., sont
placés ici.
Tests - Les fichiers de tests unitaires liés au bundle sont placés ici.
Création d'un Bundle
Étape 1 - Choisissez un espace de noms. L'espace de noms d'un bundle doit inclure le nom du
fournisseur et le nom du bundle. Dans notre cas, il s'agit de Tutorialspoint\DemoBundle.
Étape 2 - Créez une classe vide, TutorialspointDemoBundle en étendant la classe Bundle et placez-la
sous src/Tutorialspoint/DemoBundle.
namespace Tutorialspoint\DemoBundle;
use Symfony\Component\HttpKernel\Bundle\Bundle;
Étape 3 - Enregistrez la classe dans la liste des bundles pris en charge par l'application dans la classe
AppKernel.
C'est tout ce qui est nécessaire pour créer un bundle vide et tous les autres concepts sont les mêmes
que ceux de l'application.
Symfony fournit également une commande console generate:bundle pour simplifier le processus de
création d'un nouveau bundle, qui est le suivant.
Are you planning on sharing this bundle across multiple applications? [no]: no
Bundle generation
Ce chapitre explique comment créer une application simple dans le framework Symfony.
Comme indiqué précédemment, vous savez comment créer un nouveau projet dans Symfony.
Nous pouvons prendre un exemple de détails « étudiant ». Commençons par créer un projet nommé
"student" en utilisant la commande suivante.
Controller
MVC est une approche logicielle qui sépare la logique d'application de la présentation.
Toutes les pages Web d'une application doivent être gérées par un contrôleur.
La classe DefaultController est située dans "src/AppBundle/Controller". Vous pouvez y créer votre
propre classe Controller.
StudentController.php
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Response;
class StudentController {
}
Maintenant, vous avez créé un StudentController. Dans le chapitre suivant, nous discuterons plus en
détail du contrôleur.
Créer un itinéraire(Route)
Une fois le contrôleur créé, nous devons router pour une page spécifique.
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class StudentController {
/**
* @Route("/student/home")
*/
public function homeAction() {
return new Response('Student details application!');
}
}
Dans la syntaxe ci-dessus, @Route("/student/home") est la route. Il définit le modèle d'URL de la page.
homeAction() est la méthode d'action, où vous pouvez créer la page et renvoyer un objet Response.
Nous aborderons le routage en détail dans le prochain chapitre. Maintenant, demandez l'url
"http://localhost:8000/student/home" et il produit le
résultat suivant.
Résultat
Symfony - Contrôleurs
Le contrôleur est responsable du traitement de chaque requête qui arrive dans l'application Symfony.
Le contrôleur lit une information de la demande. Ensuite, crée et renvoie un objet de réponse au
client.
Selon Symfony, la classe DefaultController est située dans « src/AppBundle/Controller ». Il est défini
comme suit.
DefaultController.php
<?php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
Ici, le composant HttpFoundation définit une couche orientée objet pour la spécification HTTP, et le
FrameworkBundle contient la plupart des fonctionnalités du framework "de base".
Objet de requête
La classe Request est une représentation orientée objet du message de requête HTTP.
use Symfony\Component\HttpFoundation\Request;
$request = Request::createFromGlobals();
Vous pouvez simuler une requête à l'aide de Globals. Au lieu de créer une requête basée sur les
globals PHP, vous pouvez également simuler une requête.
$request = Request::create(
'/student',
'GET',
array('name' => 'student1')
);
Ici, la méthode create() crée une requête basée sur un URI, une méthode et certains paramètres.
Vous pouvez remplacer les variables globales PHP à l'aide de la méthode overrideGlobals(). Il est défini
comme suit.
$request->overrideGlobals();
La demande d'une page Web est accessible dans un contrôleur (méthode d'action) à l'aide de la
méthode getRequest() du contrôleur de base.
$request = $this->getRequest();
Si vous souhaitez identifier une requête dans votre application, la méthode "PathInfo" renverra
l'identité unique de l'url de la requête. Elle est définie comme suit.
$request->getPathInfo();
Objet de réponse
Un objet Response contient toutes les informations d'une requête donnée et les renvoie au client.
Exemple
use Symfony\Component\HttpFoundation\Response;
$response = new Response(‘Default'.$name, 10);
Le contenu de la réponse
Le code d'état
use Symfony\Component\HttpFoundation\Response;
$response = new Response(
'Content',
Response::HTTP_OK,
array('content-type' => 'text/html')
);
$response->setContent(’Student details’);
Envoi de la réponse
Vous pouvez envoyer une réponse au client en utilisant la méthode send(). Il est défini comme suit.
$response->send();
Pour rediriger le client vers une autre URL, vous pouvez utiliser la classe RedirectResponse.
use Symfony\Component\HttpFoundation\RedirectResponse;
$response = new RedirectResponse('http://tutorialspoint.com/');
Contrôleur avant
Un seul fichier PHP qui gère chaque requête entrant dans votre application. FrontController exécute le
routage de différentes URL vers différentes parties internes de l'application.
Voici la syntaxe de base pour FrontController.
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
$request = Request::createFromGlobals();
$path = $request->getPathInfo(); // the URI path being requested
Symfony - Routage
Segment de chemin
Segment de requête
Remarques
Même si le routage peut être effectué sans annotation, l'annotation simplifie considérablement le
routage.
/**
* @Route(“/student/home”)
*/
public function homeAction() {
// ...
}
Concepts de routage
StudentController.php
// src/AppBundle/Controller/StudentController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
/**
* @Route(“/student/about”)
*/
public function aboutAction() {
}
}
Ici, le routage effectue deux étapes. Si vous allez à /student/home, le premier itinéraire est mis en
correspondance, puis homeAction() est exécuté.
Sinon, si vous allez à /student/about, le deuxième itinéraire est mis en correspondance, puis
aboutAction() est exécuté.
Considérez que vous avez une liste paginée de dossiers d'étudiants avec des URL comme /student/2
et /student/3 pour les pages 2 et 3 en conséquence.
Ensuite, si vous souhaitez modifier le chemin de la route, vous pouvez utiliser des formats génériques.
Exemple
// src/AppBundle/Controller/BlogController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
Ici, le \d+ est une expression régulière qui correspond à un chiffre de n'importe quelle longueur.
Vous pouvez attribuer une valeur d'espace réservé dans le routage. Il est défini comme suit.
// src/AppBundle/Controller/BlogController.php
namespace AppBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
Ici, si vous allez sur /student, la route student_about correspondra et $page prendra par défaut la
valeur 1.
Si vous souhaitez rediriger l'utilisateur vers une autre page, utilisez les méthodes redirectToRoute() et
redirect().
// redirect externally
\return $this->redirect('http://example.com/doc');
}
Génération d'URL
Pour générer une URL, considérez un nom d'itinéraire, un nom_étudiant et un nom générique, les
noms d'étudiants utilisés dans le chemin de cet itinéraire. La liste complète pour générer une URL est
définie comme suit.
ÉtudiantContrôleur
StudentController.php
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
class StudentController {
/**
* @Route("/student/home")
*/
Lorsqu'un contrôleur doit générer du HTML, du CSS ou tout autre contenu, il transmet la tâche au
moteur de modélisation(Templates).
Modèles(Templates)
Les modèles sont essentiellement des fichiers texte utilisés pour générer des documents textuels tels
que HTML, XML, etc. Ils sont utilisés pour gagner du temps et réduire les erreurs.
Par défaut, les modèles peuvent résider dans deux emplacements différents − app/Resources/views/ −
Le répertoire des vues de l'application peut contenir les mises en page de votre application et les
modèles du bundle d'applications.
Moteur de brindille
Twig vous permet d'écrire des modèles concis et lisibles de manière très simple.
Les modèles Twig sont simples et ne traitent pas les balises PHP.
Twig effectue le contrôle des espaces blancs, le sandboxing et l'échappement HTML automatique.
Syntaxe
Exemple
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
Ici, la méthode render() rend un modèle et place ce contenu dans un objet Response.
home.html.twig
//app/Resources/views/student/home.html.twig
<h3>Student application!</h3>
Par défaut, Twig est livré avec une longue liste de balises, de filtres et de fonctions. Passons en revue
un par un en détail.
Mots clés
Faire
La balise do exécute des fonctions similaires à celles d'une expression régulière, à l'exception qu'elle
n'imprime rien. Sa syntaxe est la suivante -
{% do 5 + 6 %}
Inclure
L'instruction include inclut un modèle et renvoie le contenu rendu de ce fichier dans l'espace de noms
actuel. Sa syntaxe est la suivante -
{% include 'template.html' %}
Prolonge (extends)
La balise extend peut être utilisée pour étendre un modèle à partir d'un autre. Sa syntaxe est la
suivante -
{% extends "template.html" %}
Bloc
Le bloc agit comme un espace réservé et remplace le contenu. Les noms de bloc se composent de
caractères alphanumériques et de traits de soulignement. Par exemple,
Embed
La balise embed exécute une combinaison d'inclusion et d'extension. Il vous permet d'inclure le
contenu d'un autre modèle. Il vous permet également de remplacer tout bloc défini dans le modèle
inclus, comme lors de l'extension d'un modèle. Sa syntaxe est la suivante -
{% embed “new_template.twig” %}
{# These blocks are defined in “new_template.twig" #}
{% block center %}
Block content
{% endblock %}
{% endembed %}
Filtre
Les sections de filtre vous permettent d'appliquer des filtres Twig réguliers sur un bloc de données de
modèle. Par exemple,
{% filter upper %}
symfony framework
{% endfilter %}
For
{% for x in 0..10 %}
{{ x }}
{% endfor %}
IF
L'instruction if dans Twig est similaire à PHP. L'expression prend la valeur true ou false. Par exemple,
{% if value == true %}
<p>Simple If statement</p>
{% endif %}
Filtres
Twig contient des filtres. Il est utilisé pour modifier le contenu avant d'être rendu. Voici quelques-uns
des filtres notables.
Longueur
{% if name|length > 5 %}
...
{% endif %}
Lower
Le filtre Lower convertit une valeur en minuscules. Par exemple,
{{ 'SYMFONY'|lower }}
Cela donnerait le résultat suivant -
symfony
Remplacer
Le filtre de remplacement formate une chaîne donnée en remplaçant les espaces réservés. Par exemple,
Titre
Le filtre de titre renvoie une version en casse de titre de la valeur. Par exemple,
Symfony Framework
Trier
Trim
Le filtre trim supprime les espaces (ou autres caractères) du début et de la fin d'une chaîne. Par
exemple,
Symfony!
Les fonctions
Twig prend en charge les fonctions. Il est utilisé pour obtenir un résultat particulier. Voici quelques-
unes des fonctions importantes de Twig.
Attribut
La fonction d'attribut permet d'accéder à un attribut "dynamique" d'une variable. Sa syntaxe est la
suivante -
{{ attribute(object, method) }}
{{ attribute(array, item) }}
Par exemple,
Constant
La fonction constante renvoie la valeur constante d'une chaîne spécifiée. Par exemple,
{{ constant('Namespace\\Classname::CONSTANT_NAME') }}
Cycle
Date
L'argument doit être dans l'un des formats de date et d'heure pris en charge par PHP.
Décharge
La fonction de vidage vide les informations sur une variable de modèle. Par exemple,
{{ dump(user) }}
Max
La fonction max renvoie la plus grande valeur d'une séquence. Par exemple,
{{ min(1, 3, 2) }}
Inclure
{{ include('template.html') }}
Aléatoire
Range
La fonction Range renvoie une liste contenant une progression arithmétique d'entiers. Par exemple,
{% for x in range(1, 5) %}
{{ x }},
{% endfor %}
1,2,3,4,5
Dispositions
Une mise en page représente les parties communes de plusieurs vues, c'est-à-dire, par exemple, l'en-
tête et le pied de page.
Héritage de modèle
Un modèle peut être utilisé par un autre. Nous pouvons y parvenir en utilisant le concept d'héritage
de modèle.
L'héritage de modèle vous permet de créer un modèle de « mise en page » de base qui contient tous
les éléments communs du site Web définis en tant que blocs.
Exemple
<!DOCTYPE html>
<html>
<head>
<meta charset = "UTF-8">
<title>{% block title %}Parent template Layout{% endblock %}</title>
</head>
</html>
{% extends 'base.html.twig' %}
{% block title %}Child template Layout{% endblock %}
Ici, la balise {% extend %} informe le moteur de création de modèles d'évaluer d'abord le modèle de
base, qui configure la mise en page et définit le bloc. Le modèle enfant est ensuite rendu.
Un modèle enfant peut étendre la mise en page de base et remplacer le cartouche. Maintenant,
demandez l'url "http://localhost:8000" et vous pourrez obtenir son résultat.
Assets
L'actif gère la génération d'URL et la gestion des versions des actifs Web tels que les feuilles de style
CSS, les fichiers JavaScript et les fichiers image.
JavaScript
Feuilles de style
Pour inclure des fichiers de feuille de style, utilisez la balise stylesheets dans
n'importe quel modèle
{# include style sheet #}
{% block stylesheets %}
{% stylesheets 'bundles/app/css/*' filter = 'cssrewrite' %}
<link rel = "stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
{% endblock %}
Images
Pour inclure une image, vous pouvez utiliser la balise image. Il est défini comme suit.
{% image '@AppBundle/Resources/public/images/example.jpg' %}
<img src = "{{ asset_url }}" alt = "Example" />
{% endimage %}
Assets composés
Vous pouvez combiner plusieurs fichiers en un seul. Cela permet de réduire le nombre de requêtes
HTTP et produit de meilleures performances frontales.
{% javascripts
'@AppBundle/Resources/public/js/*'
'@AcmeBarBundle/Resources/public/js/form.js'
'@AcmeBarBundle/Resources/public/js/calendar.js' %}
<script src = "{{ asset_url }}"></script>
{% endjavascripts %}
Ils sont soit fournis par les clients, soit récupérés à partir de la base de données principale, manipulés
selon des règles commerciales et conservés dans la base de données.
Découvrons les modèles et comment ils interagissent avec le système back-end dans ce chapitre.
Nous devons mapper nos modèles aux éléments de la base de données relationnelle principale pour
récupérer et conserver les modèles de manière sûre et efficace.
Ce mappage peut être effectué à l'aide d'un outil ORM (Object Relational Mapping). Symfony fournit
un bundle séparé,
DoctrineBundle, qui intègre Symfony avec un outil ORM de base de données PHP tiers, Doctrine.
Doctrine ORM
Par défaut, le framework Symfony ne fournit aucun composant pour travailler avec les bases de
données.
Doctrine contient plusieurs bibliothèques PHP utilisées pour le stockage de bases de données et le
mappage d'objets.
L'exemple suivant vous aidera à comprendre comment Doctrine fonctionne, comment configurer une
base de données et comment enregistrer et récupérer les données.
Dans cet exemple, nous allons d'abord configurer la base de données et créer un objet Student, puis y
effectuer quelques opérations.
parameers.yml
parameters:
database_host: 127.0.0.1
database_port: null
database_name: studentsdb
database_user: <user_name>
database_password: <password>
mailer_transport: smtp
mailer_host: 127.0.0.1
mailer_user: null
mailer_password: null
secret: 037ab82c601c10402408b2b190d5530d602b5809
doctrine:
dbal:
driver: pdo_mysql
host: '%database_host%'
dbname: '%database_name%'
user: '%database_user%'
password: '%database_password%'
charset: utf8mb4
Exécutez la commande suivante pour générer la base de données « studentsdb ». Cette étape est
utilisée pour lier la base de données dans Doctrine ORM.
Après avoir exécuté la commande, il génère automatiquement une base de données « studentsdb »
vide.
Eh bien, ces métadonnées peuvent être spécifiées dans un certain nombre de formats différents, y
compris YAML, XML ou vous pouvez directement passer la classe Student à l'aide d'annotations. Il est
défini comme suit.
Student.php
Student.php
/**
* @ORM\Column(type = "string", length = 50)
*/
private $name;
/**
* @ORM\Column(type = "text")
*/
private $address;
}
Si le nom de la table n'est pas spécifié, il sera déterminé automatiquement en fonction du nom de la
classe d'entité.
/**
* @ORM\Column(type = "string", length = 50)
*/
private $name;
/**
* @ORM\Column(type = "text")
*/
private $address;
/**
* Get id
*
* @return integer
*/
public function getId() {
return $this->id;
}
/**
* Set name
*
* @param string $name
*
* @return Student
*/
/**
* Get name
*
* @return string
*/
public function getName() {
return $this->name;
}
/**
* Set address
*
* @param string $address
*
* @return Student
*/
/**
* Get address
*
* @return string
*/
Après avoir créé des entités, vous devez valider les mappages à l'aide de la commande suivante.
Comme nous n'avons pas créé la table des étudiants, l'entité n'est pas synchronisée.
Doctrine peut créer automatiquement toutes les tables de base de données nécessaires pour l'entité
Étudiant. Cela peut être fait en utilisant la commande suivante.
Cette commande compare ce à quoi votre base de données devrait ressembler avec son apparence
réelle et exécute les instructions SQL nécessaires pour mettre à jour le schéma de la base de données
là où il devrait être.
Comme indiqué dans la section Lier une entité, la commande suivante génère tous les getters et setters
pour la classe Student.
Nous devrions maintenant pouvoir conserver les objets Student dans la base de données.
StudentController.php
<?php
namespace AppBundle\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use AppBundle\Entity\Student;
Ici, nous avons accédé au gestionnaire de doctrine à l'aide de la méthode getManager() via
getDoctrine() du contrôleur de base, puis avons conservé l'objet actuel à l'aide de la méthode persist()
du gestionnaire de doctrine.
La méthode persist() ajoute la commande à la file d'attente, mais la méthode flush() fait le travail réel
(persistance de l'objet étudiant).
Créez une fonction dans StudentController qui affichera les détails de l'étudiant.
StudentController.php
/**
* @Route("/student/display")
*/
public function displayAction() {
$stud = $this->getDoctrine()
->getRepository('AppBundle:Student')
->findAll();
return $this->render('student/display.html.twig', array('data' => $stud));
}
Étape 11 : créer une vue
Déplacez-vous dans le répertoire des vues et créez un fichier "display.html.twig". Ajoutez les
modifications suivantes dans le fichier.
display.html.twig
<style>
.table { border-collapse: collapse; }
.table th, td {
border-bottom: 1px solid #ddd;
width: 250px;
text-align: left;
align: left;
}
</style>
Pour mettre à jour un objet dans StudentController, créez une action et ajoutez les modifications
suivantes.
/**
* @Route("/student/update/{id}")
*/
public function updateAction($id) {
$doct = $this->getDoctrine()->getManager();
$stud = $doct->getRepository('AppBundle:Student')->find($id);
if (!$stud) {
throw $this->createNotFoundException(
'No student found for id '.$id
);
}
$stud->setAddress('7 south street');
$doct->flush();
La suppression d'un objet est similaire et nécessite un appel à la méthode remove() du gestionnaire
d'entité (doctrine).
/**
* @Route("/student/delete/{id}")
*/
public function deleteAction($id) {
$doct = $this->getDoctrine()->getManager();
$stud = $doct->getRepository('AppBundle:Student')->find($id);
if (!$stud) {
throw $this->createNotFoundException('No student found for id '.$id);
}
$doct->remove($stud);
$doct->flush();
Symfony - Formulaires
Symfony fournit diverses balises intégrées pour gérer les formulaires HTML facilement et en toute
sécurité.
Il fournit un ensemble d'éléments de formulaire pour créer un formulaire html à part entière à partir
de modèles prédéfinis. Ce chapitre explique en détail les formulaires.
Champs de formulaire
Type de formulaire
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\FormType;
// ...
$builder = $this->createFormBuilder($studentinfo);
$builder
->add('title', TextType::class);
La méthode add est utilisée pour ajouter des éléments d'entrée à l'intérieur du formulaire.
Type de texte
Le champ TextType représente le champ de texte de saisie le plus basique. Sa syntaxe est la suivante -
use Symfony\Component\Form\Extension\Core\Type\TextType;
$builder->add(‘name’, TextType::class);
use Symfony\Component\Form\Extension\Core\Type\TextareaType;
$builder->add('body', TextareaType::class, array(
'attr' => array('class' => 'tinymce'),
));
Type d'e-mail
Le champ EmailType est un champ de texte rendu à l'aide de la balise HTML5email. Sa syntaxe est la
suivante
use Symfony\Component\Form\Extension\Core\Type\EmailType;
$builder->add('token', EmailType::class, array(
'data' => 'abcdef', ));
Le champ PasswordType affiche une zone de texte de saisie du mot de passe. Sa syntaxe est la
suivante -
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
$bulder->add('password', PasswordType::class);