Symfony 2 : développez votre site avec un framework PHP
Voici un prise de note rapide que j’ai pu réaliser durant la lecture du livre « Développez votre site web avec le framework SYMFONY 2 » (de Alexandre BACCO). Le livre est disponible à l’achat ou accessible gratuitement en ligne. Symfony 2 est un framework très puissant permettant de réaliser des sites robustes (structure MVC, template twig, ligne de commande, …), bref une solution à adopter au plus vite sur vos futurs projets.
(Attention le temps d’apprentissage reste assez long sur ce type de framework).
Prise de note sur Symfony 2 :
CONTROLLER : $this->getRequest() equivalent $this->get(‘request’);
RECUP VAR DE L’URL (http://URL/index.php?tag=5)
$request = $this->getRequest();
$tag = $request->query->get(‘tag’);
LISTE : getRequest()
Variables URL ($_GET) : $request->query
Variables Form ($_POST) : $request->request
Variables Cookie ($_COOKIE) : $request->cookies
Variables Serveur ($_SERVER) : $request->server
Variables d’Entete ($_SERVER[‘HTTP_*’] : $request->headers
Paramètres de route : $request->attributes
if( $request->getMethod() == ‘POST’ ){ // Un formulaire a été envoyé, on peut le traiter ici }
if( $resquest->isXmlHttpRequest() ){ // C’est une requete AJAX, retournons du JSON, par exemple }
Voir plus : http://api.symfony.com/2.2/Symfony/Component/HttpFoundation/Request.html
———————————————————————————————————————————————————
CONTROLLER : redirection
return $this->redirect( $this->generateUrl( ‘sdzblog_accueil’, array(‘page’=>2) ) );
———————————————————————————————————————————————————
CONTROLLER : render (rendre une vue)
return $this->render( ‘SdzBlogBundle:Blog:voir.html.twig’, array(« article_id »=> »18 ») );
———————————————————————————————————————————————————
CONTROLLER : Response
return new Response(« Bla bla »);
return new Response(« Afficher l’article portant l’id : « .$id);
———————————————————————————————————————————————————
CONTROLLER : envoyer email
// ENVOYER EMAIL : configurer compte d’envoi dans app/config/parameters.yml
// mailer_transport: smtp
// mailer_host: smtp.votre-serveur.fr
// mailer_user: identifiant
// mailer_password: mdp
$mailer = $this->get(‘mailer’);
$message = \Swift_Message::newInstance()
->setSubject(‘Mon sujet ici’)
->setFrom(‘moi@eewee.fr’)
->setTo(‘contact@eewee.fr’)
->setBody(‘corps du message’);
$mailer->send($message);
return new Response(‘Email bien envoyé’);
———————————————————————————————————————————————————
CONTROLLER : récupérer le contenu d’un template
$this->get(‘templating’)->render(‘SdzBlogBundle:Blog:voir.html.twig’);
———————————————————————————————————————————————————
CONTROLLER : savoir si un template existe
$this->get(‘templating’)->exists(‘SdzBlogBundle:Blog:inexistant’);
———————————————————————————————————————————————————
CONTROLLER : les services
REQUEST :
$this->get(‘request’) (équivalent à $this->getRequest(), qui est un raccourci vers le service)
SESSION
Ex :
$session = $this->get(‘session’);
// GET : Recuperation de donnee
$user_id = $session->get(‘user_id’);
// SET : maj
$session->set(‘user_id’, 55);
Ex :
$session = $this->getRequest()->getSession();
———————————————————————————————————————————————————
CONTROLLER : Message Flash
// init
$this->get(‘session’)->getFlashBag()->add(‘info’, ‘message 1 ici’);
VIEW :
// rendu
<p>
{# On affiche tous les messages flash dont le nom est « info » #}
{% for message in app.session.flashbag.get(‘info’) %}
<p>{{ message }}</p>
{% endfor %}
</p>
———————————————————————————————————————————————————
VIEW : liens
<a href='{{ path( ‘sdzblog_voir’, { ‘id’: article_id } ) }}’>Lien article id={{ article_id }} (valeur relative)</a>
<a href='{{ url( ‘sdzblog_voir’, { ‘id’: article_id } ) }}’>Lien article id={{ article_id }} (valeur absolue)</a>
———————————————————————————————————————————————————
CONTROLLER : generateUrl
return $this->redirect( $this->generateUrl(‘sdzblog_voir’, array(« id »=>5)) );
———————————————————————————————————————————————————
SERVICE :
Il est possible de créer ses propres « services », pouvant etre utiliser plusieurs fois sur votre site.
———————————————————————————————————————————————————
DECLENCHER UNE ERREUR 404 :
// on déclenche une exception NotFoundHttpException
// cela va afficher la page d’erreur 404
throw $this->createNotFoundException(‘Page inexistante (page=’.$page.’)’);
———————————————————————————————————————————————————
ENVOYER EMAIL A PARTIR D’UN TEMPLATE TXT : (p89)
$contenu = $this->renderView(‘SdzBlogBundle:Blog:email.txt.twig’, array(‘var1’=>$var1, ‘var2’=>$var2));
mail(‘email@email.fr‘, ‘inscription OK’, $contenu);
———————————————————————————————————————————————————
TWIG : equivalence twig / PHP
(p90)
{{ pseudo }} égal à <?php echo $pseudo; ?>
{{ user[‘id’] }} égal à <?php echo $user[‘id’]; ?>
{{ user.id }} égal à <?php echo $user->getId(); ?>
{{ pseudo|upper }} égal à <?php echo strtoupper( $pseudo ); ?>
{{ news.texte|striptags|title }} égal à <?php echo ucwords( strip_tags( $news->getTexte() ) ); ?>
{{ date|date(‘d/m/Y’) }} égal à <?php echo $date->format(‘d-m-Y’); ?>
{{ nom ~ » » ~ prenom }} égal à <?php echo $nom. » « .$prenom; ?>
(p91)
{{ var|upper }} => mettre la variable $var en majuscule
{{ var|striptags }} => supprime toutes les balises XML
{{ date|date(‘d-m-Y’) }} ou {{ « now »|date(‘d-m-Y’) }}
{{ « il y a %s pommes et %s poires »|format(153, nb_poires) }}
{{ texte|length }} => longueur de la variable $texte
{{ tableau|length }} => nb d’elements du tableau
(p93)
{% if member.age < 12 %}
xxx
{% elseif member.age < 18 %}
xxx
{% else %}
xxx
{% endif %}
(p94)
for
(p95)
{% set foo = « bar’ %} égal à <?php $foo = « bar »; ?>
{% if var is definied %} xxx {% endif %} égal à <?php if( isset( $var ) ); ?>
even / odd
{% for valeur in liste %}
<span class='{% if loop.index is even %}pair{% else %}impair{% endif %}’> {{ valeur }} </span>
{% endfor %}
EN SAVOIR + :
http://twig.sensiolabs.org/doc/filters/index.html
———————————————————————————————————————————————————
VARIABLES GLOBALS : (p92)
{{ app.request }}
{{ app.session }}
{{ app.envirronment }} => dev, prod
{{ app.debug }} => true si mode debug activé, false sinon
{{ app.security }}
{{ app.user }}
———————————————————————————————————————————————————
VIEW : Afficher une « action » dans une « vue »
{% render( controller(« SdzBlogBundle:Blog:menu », {‘nombre’: 3}) ) %}
———————————————————————————————————————————————————
CONTENEUR DE SERVICES : (p133)
Obtenir la liste des services :
php app/console container:debug
———————————————————————————————————————————————————
CONTROLLER : (p134)
// Appel à un service (ici le service « mailer »)
$container = $this->get(‘mailer’); égal à $container = $this->container->get(‘mailer’);
———————————————————————————————————————————————————
SERVICE : (p135 à 137)
– créer dossier (ex: Sdz/BlogBundle/Antispam)
– créer class (ex: Sdz/BlogBundle/Antispam/SdzAntispam.php)
– créer fichier extension (ex: Sdz/BlogBundle/DependencyInjection/SdzBlogExtension.php)
– ajouter le nouveau service dans Sdz/BlogBundle/Resources/config/services.yml
———————————————————————————————————————————————————
SERVICE :
1 service = 1 class
———————————————————————————————————————————————————
SERVICE :
Dans Sdz/BlogBundle/Resources/config/services.yml
On y déclare des « services » et des « parametres ».
Appeler un parametre de services.yml : $container->getParameter(« nomParam »);
———————————————————————————————————————————————————
VOCABULAIRE : (p146)
Un objet dont vous confiez l’enregistrement à l’ORM s’appelle une « entité » (entity en anglais).
Persister une entité = enregistrer une entité.
Une entité = un objet.
Les commentaires utilisaient pour la création d’une table (dans la classe Xxx) se nomment : metadata.
Rajouter les « metadata » à un objet (une classe Xxx), s’appelle : mapper l’objet Xxx.
DOCUMENTATION pour définir les metadata d’une entité : http://symfony.com/doc/current/book/doctrine.html.
———————————————————————————————————————————————————
CONSOLE : creation de la classe php représentant l’entité (p150)
php app/console generate:doctrine:entity
———————————————————————————————————————————————————
CONSOLE : creation de la table (p162)
php app/console doctrine:database:create
———————————————————————————————————————————————————
CONSOLE : compare entité + etat actuel bdd ET maj (p162)
php app/console doctrine:schema:update –dump-sql (cela affiche juste les requetes a executer)
php app/console doctrine:schema:update –force (execute les requetes
———————————————————————————————————————————————————
DOCTRINE : (p150 / 151) doctrine:generate:entity (=creer class modele)
php app/console doctrine:generate:entity (pour générer une entité entière)
The entity shortcut name : SdzBlogBundle:Article (entrée)
Configuration format (yml, xml, php, or annotation) : annotation (entrée)
Entrée les attributs de la table (date, titre, auteur, nom, etc …)
Do you want to generate an empty repository class : yes (entrée)
———————————————————————————————————————————————————
DOCTRINE : (p162 / 163) doctrine:database:update (=creer table)
php app/console doctrine:database:create (créer la bdd, on ne le fait qu’une seule fois bien sur)
php app/console doctrine:schema:update –dump-sql (affiche la requete)
php app/console doctrine:schema:update –force (execute la requete affichée avec –dump-sql)
———————————————————————————————————————————————————
DOCTRINE : (p164) doctrine:generate:entities (=maj de la class modele)
php app/console doctrine:generate:entities SdzBlogBundle:Article (génère les entités en fonction du mapping)
———————————————————————————————————————————————————
DOCTRINE : (p165)
Service « doctrine » (permet de gérer la bdd)
$this->get(‘doctrine’) égal à $this->getDoctrine();
$this->getDoctrine() permet l’autocompletion
$em = $this->getDoctrine()->getManager(); égal à $this->get(‘doctrine.orm.entity_manager’)
$this->getDoctrine()->getManager() permet l’autocompletion
———————————————————————————————————————————————————
DOCTRINE : (p170)
$em = $this->getDoctrine()->getManager();
$em->persist() : garde cette entite en memoire, tu l’enregistreras au prochain « flush »
$em->flush() : ouvre une transaction et enregistre toutes les entites qui t’ont été donnees depuis le dernier flush()
———————————————————————————————————————————————————
DOCTRINE : (p175)
EntityManager sert à manipuler les entités
Repositories servent à récupérer les entités
———————————————————————————————————————————————————
DOCTRINE : (p182)
@ORM\OneToOne est incompatible avec @ORM\column
———————————————————————————————————————————————————