Télécharger la présentation
1
Symfony2, les grandes lignes
Jérôme CUTRONA 03:05:26 Programmation Web
2
Introduction 03:05:26 Programmation Web
3
Symfony Lancement de symfony-project.com en 2005
Framework Web MVC en PHP Créé par Sensio, agence Web française Utilise d’autres projets PHP : Doctrine, Propel, PDO, PHPUnit, Twig, … Utilisé par d’autres projets : Drupal, phpBB, Laravel, … Utilisé par de nombreux sites à travers le monde Philosophie : ne pas réinventer la roue 03:05:26 Programmation Web
4
03:05:26 Programmation Web
5
Symfony2 Composants PHP réutilisables Framework (cadre de travail) PHP
Base pour l’architecture d’une application Web Ne plus réinventer la roue : routes, formulaires… Code : conventions et organisation Architecture MVC Composants testés et éprouvés Communauté de développeurs Documentation 03:05:26 Programmation Web
6
Composer, Dependency Manager for PHP
03:05:26 Programmation Web
7
Composer https://getcomposer.org/
Outil de gestion des dépendances de bibliothèques Écrit en PHP, utilisé en ligne de commande Comfiguration des bibliothèques et de leurs dépendances dans composer.js Installation : curl -sS | php ou php -r "readfile(' | php 03:05:26 Programmation Web
8
Installer Symfony2 avec Composer
Composer est une archive PHP, un fichier .phar (PHP Archive) Si PHP est accessible en ligne de commande, Composer peut être exécuté comme une commande : ./composer.phar Pour installer Symfony2 : composer create-project symfony/framework-standard-edition path/ "2.5.*" 03:05:26 Programmation Web
9
Installer Symfony2 avec Composer
composer create-project symfony/framework-standard-edition Symfony "2.5.*" Installing symfony/framework-standard-edition (v2.5.5) - Installing symfony/framework-standard-edition (v2.5.5) Downloading: 100% Created project in Symfony2 Loading composer repositories with package information Installing dependencies (including require-dev) - Installing jdorn/sql-formatter (v1.2.17) - Installing psr/log (1.0.0) - Installing twig/twig (v1.16.1) - Installing doctrine/lexer (v1.0) … 03:05:26 Programmation Web
10
Installer Symfony2 avec Composer
Would you like to install Acme demo bundle? [y/N] n Creating the "app/config/parameters.yml" file Some parameters are missing. Please provide them. database_driver (pdo_mysql): database_host ( ): mysql database_port (null): database_name (symfony): cutron01 database_user (root): cutron01 database_password (null): pass mailer_transport (smtp): mailer_host ( ): mailer_user (null): mailer_password (null): locale (en): fr secret (ThisTokenIsNotSoSecretChangeIt): debug_toolbar (true): debug_redirects (false): use_assetic_controller (true): Clearing the cache for the dev environment with debug true Installing assets as hard copies Installing assets for Symfony\Bundle\FrameworkBundle into web/bundles/framework Installing assets for Sensio\Bundle\DistributionBundle into web/bundles/sensiodistribution 03:05:26 Programmation Web
11
Architecture des fichiers
03:05:26 Programmation Web
12
Architecture des répertoires
app L’application Web sans son code source src Les sources de l’application Web vendor Bibliothèques utilisées par l’application Web bin Fichiers binaires des bibliothèques utilisées par l’application Web web Ressources statiques et contrôleur frontal 03:05:26 Programmation Web
13
CONTRÔLEUR FRONTAL 03:05:26 Programmation Web
14
Contrôleur frontal ? Jusqu’à présent, vous utilisiez de multiples scripts PHP : saisir_donnees.php valider_donnees.php … L’architecture de Symfony2 n’utilise qu’un seul script, le contrôleur frontal Tous les contenus dynamiques PHP seront produits par ce script C’est le point d’entrée unique de l’application 03:05:26 Programmation Web
15
En réalité, plusieurs contrôleurs frontaux
Environnement de production : app.php Application telle qu’elle sera visible par les visiteurs Rapidité nécessaire Tests de cache peu poussés Environnement de développement : app_dev.php Application pour les développeurs Environnement de débogage complet Plus lent que la version de production 03:05:26 Programmation Web
16
Environnement de production
03:05:26 Programmation Web
17
Environnement de développement
03:05:26 Programmation Web
18
Le profiler en mode développement
03:05:26 Programmation Web
19
Flux applicatif 03:05:26 Programmation Web
20
Flux applicatif de Symfony2
Toutes les requêtes sont interceptées par le contrôleur frontal Le noyau trouve le contrôleur via le système de routage et exécute l’action adéquate Une réponse est produite 03:05:26 Programmation Web
21
Architecture MVC 03:05:26 Programmation Web
22
Architecture MVC Modèle Vue Contrôleur Doctrine2
Accès/persistance des données Vue Twig Présentation des données Contrôleur Symfony Logique de l’application Utilise le modèle Prépare les données pour la vue 03:05:26 Programmation Web
23
Les bundles 03:05:26 Programmation Web
24
Bundle (paquet) Bundle = brique de l’application
Gestion des utilisateurs Boutique Administration, … Ensemble structuré de fichiers permettant la gestion d’une partie de l’application Bundles de la communauté Symfony2 FOSUserBundle DoctrineFixturesBundle WebProfilerExtraBundle, … 03:05:26 Programmation Web
25
Créer un bundle Utilisation de la console app/console
Symfony version app/dev/debug Usage: [options] command [arguments] app/console generate:bundle Welcome to the Symfony2 bundle generator … Each bundle is hosted under a namespace (like vAcme/Bundle/BlogBundle). The namespace should begin with a "vendor" name like your company name, your project name, or your client name, followed by one or more optional category sub-namespaces, and it should end with the bundle name itself (which must have Bundle as a suffix). Use / instead of \ for the namespace delimiter to avoid any problem. 03:05:26 Programmation Web
26
Créer un bundle Bundle namespace: cutrona\TestBundle In your code, a bundle is often referenced by its name. It can be the concatenation of all namespace parts but it's really up to you to come up with a unique name (a good practice is to start with the vendor name). Based on the namespace, we suggest cutronaTestBundle. Bundle name [cutronaTestBundle]: The bundle can be generated anywhere. The suggested default directory uses the standard conventions. Target directory [/home/Enseignants/cutron01/public_html/Symfony/src]: Determine the format to use for the generated configuration. Configuration format (yml, xml, php, or annotation): yml To help you get started faster, the command can generate some code snippets for you. Do you want to generate the whole directory structure [no]? yes 03:05:26 Programmation Web
27
Créer un bundle Summary before generation You are going to generate a "cutrona\TestBundle\cutronaTestBundle" bundle in "/home/Enseignants/cutron01/public_html/Symfony/src/" using the "yml" format. Do you confirm generation [yes]? Bundle generation Generating the bundle code: OK Checking that the bundle is autoloaded: OK Confirm automatic update of your Kernel [yes]? Enabling the bundle inside the Kernel: OK Confirm automatic update of the Routing [yes]? Importing the bundle routing resource: OK You can now start using the generated code! 03:05:26 Programmation Web
28
contrôleurs (controller)
Créer un bundle vendeur (vendor) paquet (bundle) contrôleurs (controller) configuration vues (view) 03:05:26 Programmation Web
29
Les fichiers de configuration
03:05:26 Programmation Web
30
Les fichiers de configuration
De nombreux éléments de Symfony vont devoir être configurés Le but est de séparer le code de l’application et sa configuration La configuration consiste en un ensemble de données structurées Il existe 3 formats possibles : XML, namespace et schémas, visuellement lourd PHP, namespace, instanciation, peu lisible YAML, simple et efficace ! Nous retiendrons le format YAML pour les TP 03:05:26 Programmation Web
31
Le format YAML 03:05:26 Programmation Web
32
YAML, les grandes lignes
YAML: YAML Ain't Markup Language What It Is: YAML is a human friendly data serialization standard for all programming languages. YAML est un standard de sérialisation de données compréhensible facilement par l'humain pour tous les langages de programmation Fichiers texte .yml facilement lisibles et modifiables 03:05:26 Programmation Web
33
YAML, les types Chaîne de caractères Une chaîne de caractères en YAML 'Entourée par des guillemets simples en YAML' Nombres x e+42 .inf Nuls null ~ Booléens true false Dates t12:12: : 03:05:26 Programmation Web
34
YAML, les types Séquences (- suivi de espace) - XML - YAML
Séquences (entre crochets) [XML, YAML] Couple clé/valeur (: suivi de espace(s)) PHP: Liste (indentation espaces, jamais tabulations) xml: pas bon yaml: bon Liste (entre accolades) {xml: pas bon, yaml: bon} 03:05:26 Programmation Web
35
Vérifier vos fichiers YAML
Utilisation de la console Un fichier particulier app/console yaml:lint src/Cutrona/TestBundle/Resources/config/routing.yaml Un répertoire app/console yaml:lint src/Cutrona/TestBundle/Resources/config Un bundle complet app/console 03:05:26 Programmation Web
36
Le routage 03:05:26 Programmation Web
37
Le routage Faire correspondre une URL et une action d’un contrôleur
Configuration du routage général de l’application dans app/config/routing.yml cutrona_test: resource: prefix: / La configuration du routage d’un bundle est faite dans ce bundle Import possible des routes d’un bundle dans la configuration générale 03:05:26 Programmation Web
38
Le routage Routes dans un bundle : src/Cutrona/TestBundle/Resources/config/routing.yml cutrona_test_homepage: path: /hello/{name} defaults: { _controller: CutronaTestBundle:Default:index } cutrona_test_helloworld: path: / defaults: { _controller: CutronaTestBundle:Default:helloWorld } Chaque route est nommée Correspondance entre une URL et un contrôleur Testées dans l’ordre 03:05:26 Programmation Web
39
Le routage avec paramètres
Éléments entre {} dans l’URL (path: xxx) cutrona_test_homepage: path: /hello/{name} defaults: { _controller: CutronaTestBundle:Default:index } cutrona_test_helloworldT: path: /{times} defaults: { _controller: CutronaTestBundle:Default:helloWorldT } requirements: times: \d+ Chaque route est nommée Correspondance entre une URL et un contrôleur Testées dans l’ordre, la première correspondance est déclenchée 03:05:26 Programmation Web
40
Consultation des routes en console
app/console router:debug --env=dev [router] Current routes Name Method Scheme Host Path _wdt ANY ANY ANY /_wdt/{token} _profiler_home ANY ANY ANY /_profiler/ _profiler_search ANY ANY ANY /_profiler/search _profiler_search_bar ANY ANY ANY /_profiler/search_bar _profiler_purge ANY ANY ANY /_profiler/purge _profiler_info ANY ANY ANY /_profiler/info/{about} _profiler_phpinfo ANY ANY ANY /_profiler/phpinfo _profiler_search_results ANY ANY ANY /_profiler/{token}/search/results _profiler ANY ANY ANY /_profiler/{token} _profiler_router ANY ANY ANY /_profiler/{token}/router _profiler_exception ANY ANY ANY /_profiler/{token}/exception _profiler_exception_css ANY ANY ANY /_profiler/{token}/exception.css _configurator_home ANY ANY ANY /_configurator/ _configurator_step ANY ANY ANY /_configurator/step/{index} _configurator_final ANY ANY ANY /_configurator/final cutrona_test_homepage ANY ANY ANY /hello/{name} cutrona_test_helloworld ANY ANY ANY / cutrona_test_helloworldT ANY ANY ANY /{times} 03:05:26 Programmation Web
41
Consultation du routage avec Profiler
03:05:26 Programmation Web
42
Routes pour produire des URL
Les routes permettent de faire correspondre une URL et une action d’un contrôleur Cette relation est une bijection Le nom de la route permet de produire son URL relative ou absolue Découplage complet permettant de modifier un paramètre sans tout réexaminer/réécrire Sera utilisé en particulier dans les vues Route nommée : URL action d’un contrôleur Nom d’une route URL de la route 03:05:26 Programmation Web
43
LES CONTRÔLEURS ET LES ACTIONS
03:05:26 Programmation Web
44
Les contrôleurs Regroupés dans src/Cutrona/TestBundle/Controller/
Leur nom se termine obligatoirement par Controller Exemple DefaultController Héritent de Controller du namespace Symfony\Bundle\FrameworkBundle\Controller\Controller Font partie du namespace Controler du bundle : Cutrona\TestBundle\Controller Contiennent les actions 03:05:26 Programmation Web
45
Les actions Méthodes publiques des contrôleurs
Leur nom se termine obligatoirement par Action Exemple : HelloWorldAction() Reçoivent automatiquement en paramètre les paramètres des routes cutrona_test_helloworldT: path: /{times} defaults: { _controller: CutronaTestBundle:Default:helloWorldT } requirements: times: \d+ public function helloWorldTAction($times) { 03:05:26 Programmation Web
46
Les actions Briques de la logique applicative :
Interagissent avec les données Présentent des données à afficher aux vues Retournent un objet Response du namespace Symfony\Component\HttpFoundation\Response : return new Response('Hello World!'); Peuvent déclencher l’affichage d’une vue : return $this->render( 'CutronaTestBundle:Default:index.html.twig', array('name' => $name)); 03:05:26 Programmation Web
47
Les vues 03:05:26 Programmation Web
48
Les vues Constituent la partie présentation de l’application
Utilisent le moteur de templates (modèles) Twig Reçoivent des données du contrôleur Peuvent utiliser des structures algorithmiques Ne contiennent aucun code PHP Utilisent le pseudo-langage Twig à base de { } Les templates Twig peuvent être hérités ou inclus pour un meilleur découpage Classiquement, 3 niveaux d’héritage : application section page 03:05:26 Programmation Web
49
Les vues src/Cutrona/TestBundle/Resources/views/Default/index.html.twig <!doctype html> <html> <head><title>Hello</title></head> <body> Hello {{ name }}! </body> </html> 03:05:26 Programmation Web
50
Twig 03:05:26 Programmation Web
51
Twig, les bases {{ … }} Écrire dans le template, une variable ou le résultat d’une expression <h1>{{ page_title }}</h1> {% … %} Contrôler la logique du template, instructions, états, structures algorithmiques {% for user in users %} * {{ user.name }} {% else %} No users have been found. {% endfor %} {# … #} Commentaires {# page_title : Titre de la page #} 03:05:26 Programmation Web
52
Écrire dans le template
Variables simples <h1>{{ page_title }}</h1> Variables simples filtrées <h1>{{ page_title | upper }}</h1> Fonctions <a href="{{ url('_welcome') }}">Home</a> Attributs d’objets <span>{{ user.name }}</span> Méthode d’instances <span>{{ user.getName() }}</span> 03:05:26 Programmation Web
53
Production d’URL dans le template
cutrona_test_helloworldtimes: path: /{times} defaults: { _controller: CutronaTestBundle:Default:helloWorldTimes } requirements: times: \d+ URL relative <a href="{{ path('cutrona_test_helloworldtimes', {'times': 5}) }}">Hello (5)</a> produit <a href="/Symfony2/web/app_dev.php/5">Hello (5)</a> URL absolue <a href="{{ url('cutrona_test_helloworldtimes', {'times': 5}) }}">Hello (5)</a> produit <a href=" (5)</a> 03:05:26 Programmation Web
54
Vérifier vos templates Twig
Utilisation de la console Un fichier particulier app/console twig:lint src/Cutrona/TestBundle/Resources/views/Default/index.html.twig Un répertoire app/console twig:lint src/Cutrona/TestBundle/Resources/views Un bundle complet app/console 03:05:26 Programmation Web
55
Accès à la base de données : ORM Doctrine2
03:05:26 Programmation Web
56
ORM ORM : Object-Relational Mapping
Couche d’abstraction d’accès aux données Ne plus écrire de requêtes mais des objets Lazy loading (chargement paresseux) Décrire les relations entre objets One-To-One Many-To-One Many-To-Many Many-To-Many avec attributs Gestion personnalisée des accès si nécessaire 03:05:26 Programmation Web
57
ORM : Entités Le mapping (mise en correspondance) entre un objet et une table de la base de données se fait par le biais d’une entité (Entity) L’entité est une classe qui possède des attributs et se situe dans xxxBundle/Entity Des annotations permettent de faire le lien avec la base de données La console permet de générer automatiquement accesseurs (getters) et modificateurs (setters) La console peut générer la table de la base de donnes à partir de l’entité 03:05:26 Programmation Web
58
Entité : un exemple Base de données « morceaux de musique »
namespace Cutrona\TestBundle\Entity ; use Doctrine\ORM\Mapping as ORM ; /** */ class Artist { private $id ; private $name ; 03:05:26 Programmation Web
59
Entité : génération de code
app/console doctrine:generate:entities Cutrona/TestBundle/Entity/Artist Generating entity "Cutrona\TestBundle\Entity\Artist" > backing up Artist.php to Artist.php~ > generating Cutrona\TestBundle\Entity\Artist /** * Set id * integer $id Artist */ public function setId($id) { $this->id = $id; return $this; } /** * Get id * integer */ public function getId() { return $this->id; } … 03:05:26 Programmation Web
60
Utilisation de l’entité
Contrôleur <?php namespace Cutrona\TestBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; use Cutrona\TestBundle\Entity\Artist; class DefaultController extends Controller { public function ArtistAction($id) { $a = $this->getDoctrine() ->getManager()->find('CutronaTestBundle:Artist', $id) ; return $this->render( 'CutronaTestBundle:Default:artist.html.twig', array('artist' => $a)) ; } Vue L'artiste {{ artist.id}} est '{{ artist.name }}' 03:05:26 Programmation Web
61
Génération automatique des entités
doctrine peut effectuer une introspection de la base et produire automatiquement les entités mapping app/console doctrine:mapping:convert yml src/Cutrona/TestBundle/Resources/config/doctrine/metadata/orm --from-database entities app/console doctrine:mapping:import CutronaTestBundle annotation code app/console doctrine:generate:entities CutronaTestBundle 03:05:26 Programmation Web
62
Mise à jour de la base de données
Les modifications des entités peuvent être rendues persistantes dans la base de données persist($entity) demande de persistance flush() synchronisation de la BD public function ArtistUpdateAction($id, $name) { $em = $this->getDoctrine()->getManager() ; $a = $em->find('CutronaTestBundle:Artist', $id) ; $a->setName($name) ; $em->persist($a) ; $em->flush() ; return new Response('Modification effectuée') ; } 03:05:26 Programmation Web
63
Les formulaires 03:05:26 Programmation Web
64
Objectif des formulaires
Un formulaire se construit sur un objet Son objectif est d’hydrater l’objet Hydrater : affecter les attributs de l’objet Construire un formulaire : FormBuilder Ajouter des champs au formulaire, type sémantique : text, , integer, … Sécurisation automatique Contrôler la validité d’un formulaire Exploitation du formulaire dans la vue Twig : {{ form_widget(form) }} 03:05:26 Programmation Web
65
Exemple d’utilisation de formulaire
public function ArtistAction($id) { $request = $this->get('request') ; $em = $this->getDoctrine()->getManager() ; $artist = $em->find('CutronaTestBundle:Artist', $id) ; $formBuilder = $this->createFormBuilder($artist) ; $formBuilder->add('name', 'text', array('required' => true)) ; $form = $formBuilder->getForm() ; if ($request->getMethod() == 'POST') { $form->bind($request) ; if ($form->isValid()) { $em->persist($artist) ; $em->flush() ; return new Response('Modification effectuée') ; } else { return $this->render( 'CutronaTestBundle:Default:artist.html.twig', array('artist' => $artist, 'form' => $form->createView())) ; 03:05:26 Programmation Web
66
Sécurité 03:05:26 Programmation Web
67
Sécurité, principe La sécurité regroupe deux principes :
Authentification (authentication) Droits d’accès (authorization) L’authentification consiste à s’assurer de l’identité d’un utilisateur : formulaire de connexion, authentification HTTP, … Authentification gérée par le firewall Les droits d’accès permettent de contrôler qu’un utilisateur authentifié peut exécuter une action Droits d’accès sont gérés par access control Configuré dans app/config/security.yml 03:05:26 Programmation Web
68
Sécurité, principe 03:05:26 Programmation Web
69
Sécurité, accès illimité
03:05:26 Programmation Web
70
Sécurité, accès non authentifié
03:05:26 Programmation Web
71
Sécurité, accès refusé 03:05:26 Programmation Web
72
Sécurité, accès avec privilèges
03:05:26 Programmation Web
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.