Symfony2, les grandes lignes

Slides:



Advertisements
Présentations similaires
Novembre 2005 – Michel Desconnets PHP : théorie Objectif : introduire les concepts globaux permettant d'aborder la programmation en PHP.
Advertisements

Projets Dossier de conception Logiciel
Conception de Site Webs dynamiques Cours 5
DTD Sylvain Salvati
Algorithmes et structures de données avancées Partie Conception de Sites Web dynamiques Cours 9 Patrick Reuter.
Au programme du jour …. Ce que vous navez pas encore vu Constantes et variables de classe Main et Tests Utilisation de lAPI Existence des packages Existence.
Au programme du jour …. Introduction à lhéritage Un concept important de la programmation objet Livraison de code Organisation des répertoires et packages.
Personal Home Page / Hypertext Processor (PHP)
Symfony i18n. terminologie internationalization = i18n –Un même contenu traduit en plusieurs langue, éventuellement converti en différents formats localization.
Symfony configuration.
Symfony Liens & routing.
Design Pattern MVC En PHP5.
CURSUS DE FORMATION AUX NOUVELLES TECHNOLOGIES DE DEVELOPPEMENT UV EJB Entité Module Java Expert.
TP 3-4 BD21.
Jérôme CUTRONA PHP et bases de données Jérôme CUTRONA 01:07:51 Programmation Web
Bonnes pratiques ez publish
1 ARCHITECTURE DACCÈS la méthode générale modèle de données définitions module daccès / modules métiers construction des modèles les modules daccès, les.
LOG 02 Bases de Données Avancées Rappels sur JSP / Servlet
Développement d’applications web
Le langage PHP 5.
Struts 1 & 2 Tlohi ibtissam Tabit boutaina Ilias bouras
Père Stéphane-Paul BENTZ IUT de Colmar Séminaire de Paris
Tapestry - Eclipse Link
Développement Rapide dApplications Web avec.NET « Mon premier site »
Symfony2.
ASP.NET Par: Hugo St-Louis. C ARACTÉRISTIQUES A SP. NET Évolution, successeur plus flexible quASP (Active Server Pages). Pages web dynamiques permettant.
Développement d’application web
Xpath XML Path language par Yves Bekkers
Architecture dun site de vente au détail1 Modèle d'un site simple de vente Lexemple du livre Ruby on Rails Partie II Java Adventure Builder Demo Réalisé.
PhP-MySQL Pagora 2012/2013 CTD 1 - Presentation de moi ^^
1 CSI 2532 Lab6 Application Web et DB Février 27, 2012.
Chapitre 3 Les bibliothèques de balises JSP et la JSTL
Initiation au web dynamique - TP
JEE 5 F.Pfister 2 institut eerie JEE – Une plateforme serveur  Développement et exécution d'applications réparties.
Animateur : Med HAIJOUBI
PHP & My SQL.
JavaScript Nécessaire Web.
Content Management System CMS. Pourquoi ? Obligation de ressaisir des contenus publiés à plusieurs endroits Pas d’outils de gestion de qualité de l’information.
Elabore par BELKADHI ABIR BEN HASSEN SALMA CHEBBI MARWA
0 Objectifs de la session n°1  Revenir sur toutes les bases théoriques nécessaires pour devenir un développeur Web,  Découvrir l’ensemble des langages.
Créer des packages.
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
05/02/98WEB ESNIG Modèle logique de données Oracle Designer/2000 & Oracle Web Server.
Acquisition d’information sur internet
PHP objet Jérôme CUTRONA 10:13:27 Programmation Web
SciTools Understand A Source Code Analysis and Metrics Tool
Présentation du framework JSF (Java Server Faces) dans le modèle événementiel MVCII
PLAN Correction du RUSH 3
Struts.
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
G.KEMBELLEC - UP81 Master 2 THYP Cas pratique d’utilisation De simpleXML Un lecteur de RSS Novembre 2009.
Serveur de mail sous GNU/Linux Installation et configuration d’un module SMTP : Postfix Installation d’un module POP/IMAP : courier-pop Configuration d’un.
PHP5 objet "avancé" Jérôme CUTRONA 09:56:48 Programmation Web
 Formulaires HTML : traiter les entrées utilisateur
Master 1 SIGLIS Intégration des données dans l’entreprise Stéphane Tallard JDBC: Java Database Connectivity Master 1 SIGLIS1JDBC.
Initiation au JavaScript
Cours sur le DOI COULET Alban GREMONT Baptiste GIDO2A Le 13/12/2007.
Pile-Face 1. Parlez en français! (Full sentences) 2. One person should not dominate the conversation 3. Speak the entire time The goal: Practice! Get better.
Initiation au web dynamique Licence Professionnelle.
Struts v1 – Xstream  BENARD Thomas  CAROFF Brice  LETEL Quentin  NORET Nicolas  ROCHER Christian.
Cours Access TuanLoc NGUYEN. Contact Nguyen TuanLoc Tél: Web:
Les Java Server Pages Dans ce chapitre, nous allons :
CPI/BTS 2 Programmation Web Les sites dynamiques Prog Web CPI/BTS2 – M. Dravet – 02/10/2003 Dernière modification: 02/10/2003.
Répétez! Bonjour!. Je m’appelle ________. Et toi ? Tu t’appelles comment? Répétez!
Bases de données Singleton pour la connexion
Parquet Geoffrey 3 ARIL EXIA.CESI ARRAS. Présentation du MLD Présentation de la persistance Présentation récapitulatif du projet JSP/SERVLET MVC Cycle.
APP-TSWD Apprentissage Par Problèmes Techniques des Sites Web Dynamiques Licence Professionnelle FNEPI Valérie Bellynck, Benjamin Brichet-Billet, Mazen.
APP-TSWD Apprentissage Par Problèmes Techniques des Sites Web Dynamiques Licence Professionnelle FNEPI Valérie Bellynck, Benjamin Brichet-Billet, Mazen.
TITLE Business PowerPoint Templates PowerPoint note pad template.
Transcription de la présentation:

Symfony2, les grandes lignes Jérôme CUTRONA jerome.cutrona@univ-reims.fr 03:05:26 Programmation Web 2014-2015

Introduction 03:05:26 Programmation Web 2014-2015

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 http://symfony.com/ 03:05:26 Programmation Web 2014-2015

http://symfony.com/ 03:05:26 Programmation Web 2014-2015

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 2014-2015

Composer, Dependency Manager for PHP 03:05:26 Programmation Web 2014-2015

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 https://getcomposer.org/installer | php ou php -r "readfile('https://getcomposer.org/installer');" | php 03:05:26 Programmation Web 2014-2015

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 2014-2015

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 2014-2015

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 (127.0.0.1): mysql database_port (null): database_name (symfony): cutron01 database_user (root): cutron01 database_password (null): pass mailer_transport (smtp): mailer_host (127.0.0.1): mailer_user (null): mailer_password (null): locale (en): fr secret (ThisTokenIsNotSoSecretChangeIt): 1234567890 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 2014-2015

Architecture des fichiers 03:05:26 Programmation Web 2014-2015

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 2014-2015

CONTRÔLEUR FRONTAL 03:05:26 Programmation Web 2014-2015

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 2014-2015

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 2014-2015

Environnement de production http://cutrona/Symfony/web/app.php/hello/Bob http://cutrona/Symfony/web/app.php/oops/Bob 03:05:26 Programmation Web 2014-2015

Environnement de développement http://cutrona/Symfony/web/app_dev.php/hello/Bob http://cutrona/Symfony/web/app_dev.php/oops/Bob 03:05:26 Programmation Web 2014-2015

Le profiler en mode développement 03:05:26 Programmation Web 2014-2015

Flux applicatif 03:05:26 Programmation Web 2014-2015

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 2014-2015

Architecture MVC 03:05:26 Programmation Web 2014-2015

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 2014-2015

Les bundles 03:05:26 Programmation Web 2014-2015

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 http://knpbundles.com/ FOSUserBundle DoctrineFixturesBundle WebProfilerExtraBundle, … 03:05:26 Programmation Web 2014-2015

Créer un bundle Utilisation de la console app/console Symfony version 2.5.5 - 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 2014-2015

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 2014-2015

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 2014-2015

contrôleurs (controller) Créer un bundle vendeur (vendor) paquet (bundle) contrôleurs (controller) configuration vues (view) 03:05:26 Programmation Web 2014-2015

Les fichiers de configuration 03:05:26 Programmation Web 2014-2015

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 2014-2015

Le format YAML 03:05:26 Programmation Web 2014-2015

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 2014-2015

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 12 012 0x12 12.42 1.2e+42 .inf Nuls null ~ Booléens true false Dates 2012-12-12t12:12:12.12+02:00 2012-12-12 03:05:26 Programmation Web 2014-2015

YAML, les types Séquences (- suivi de espace) - XML - YAML Séquences (entre crochets) [XML, YAML] Couple clé/valeur (: suivi de espace(s)) PHP: 5.5.16 Liste (indentation espaces, jamais tabulations) xml: pas bon yaml: bon Liste (entre accolades) {xml: pas bon, yaml: bon} 03:05:26 Programmation Web 2014-2015

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 yaml:lint @CutronaTestBundle 03:05:26 Programmation Web 2014-2015

Le routage 03:05:26 Programmation Web 2014-2015

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: "@CutronaTestBundle/Resources/config/routing.yml" 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 2014-2015

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 2014-2015

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 2014-2015

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 2014-2015

Consultation du routage avec Profiler 03:05:26 Programmation Web 2014-2015

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 2014-2015

LES CONTRÔLEURS ET LES ACTIONS 03:05:26 Programmation Web 2014-2015

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 2014-2015

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 2014-2015

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 2014-2015

Les vues 03:05:26 Programmation Web 2014-2015

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 2014-2015

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 2014-2015

Twig 03:05:26 Programmation Web 2014-2015

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 2014-2015

É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 2014-2015

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="http://cutrona/Symfony2/Symfony2/web/app_dev.php/5">Hello (5)</a> 03:05:26 Programmation Web 2014-2015

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 twig:lint @CutronaTestBundle 03:05:26 Programmation Web 2014-2015

Accès à la base de données : ORM Doctrine2 03:05:26 Programmation Web 2014-2015

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 2014-2015

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 2014-2015

Entité : un exemple Base de données « morceaux de musique » namespace Cutrona\TestBundle\Entity ; use Doctrine\ORM\Mapping as ORM ; /** * @ORM\Entity * @ORM\Table(name="artist") */ class Artist { * @ORM\Id * @ORM\Column(type="integer") private $id ; * @ORM\Column(type="string") private $name ; 03:05:26 Programmation Web 2014-2015

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 * * @param integer $id * @return Artist */ public function setId($id) { $this->id = $id;   return $this; } /** * Get id * * @return integer */ public function getId() { return $this->id; } … 03:05:26 Programmation Web 2014-2015

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 2014-2015

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 2014-2015

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 2014-2015

Les formulaires 03:05:26 Programmation Web 2014-2015

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, email, 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 2014-2015

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 2014-2015

Sécurité 03:05:26 Programmation Web 2014-2015

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 2014-2015

Sécurité, principe 03:05:26 Programmation Web 2014-2015

Sécurité, accès illimité 03:05:26 Programmation Web 2014-2015

Sécurité, accès non authentifié 03:05:26 Programmation Web 2014-2015

Sécurité, accès refusé 03:05:26 Programmation Web 2014-2015

Sécurité, accès avec privilèges 03:05:26 Programmation Web 2014-2015