Compte rendu Symphony.docx

Transcription

Compte rendu Symphony.docx
Compte rendu Symphony
1/17
Présentation
Définition d’un framework
Objectif
Symfony 2
Installation
Architecture
Architecture des fichiers :
Architecture conceptuelle :
BD
Concept des Bundle
Structure des bundles
Création de Bundle
Création d’une page avec Symfony2
Création de route
Création d’un contrôleur :
Création du Template :
Formulaire
Doctrine2
Exemples
2/17
Présentation
Définition d’un framework
Framework signifie en français cadre de travail, c’est un environnement qui met à disposition des
outils pour faciliter le travail, pour le développeur il fournit des librairies, des bases de données, des
codes préconçus par d’autres développeur
Objectif
L’objectif principal est d’améliorer la productivité des développeurs. Le Framework permet
de gagner du temps, il s’occupe de la forme, et les développeur se focalise sur le fond.
Symfony 2
Symfony est un framework php, sa première version est sortie en 2005. La deuxième version est
sortie en 2011. Cette deuxième version est plus rapide et plus souple que la première. Ce framework
Open source est développé par toute une communauté international.
Pour
Contre
- le code
le framework incite à organiser correctement le
code, il fournit des composants, du code pré-écrit
- le travail: utilisation de l’architecture MVC,
utilisation de convention de code
- la communauté: elle fournit des tutoriaux et des
mises à jour du framework.
- Difficulté d’apprentissage (Temps
d’apprentissage long)
-Etre au courant des nouveautés,
connaître le modèle MVC
Installation
Sous Ubuntu :
- Télécharger le fichier Symfony Standard 2.3.6(.tgz) sur http://symfony.com/download
- Décompresser le fichier là où on le souhaite
- renommer le fichier en un nom de projet (ex: recette ou blog)
- modifier les droits de app/cache et app/logs:
sudo setfacl -R -m u:www-data:rwx -m u:user:rwx app/cache app/logs
sudo setfacl -dR -m u:www-data:rwx -m u:user:rwx app/cache app/logs
- il faut créer un virtualHost pour pouvoir accéder au fichier dans un fichier
sudo vi /etc/apache2/sistes-available/<nom du projet>.conf
<VirtualHost *:80>
DocumentRoot "/home/pascal/dev/recette/web/"
ServerName recette.local
DirectoryIndex index.php
3/17
<Directory "/home/pascal/dev/recette/web/">
AllowOverride All
Allow from All
</Directory>
</VirtualHost>
Ensuite pour ajouter le site et qu’il soit pris en compte par apache, il faut taper 2commandes:
- sudo a2ensite recette.conf
- sudo service apache2 reload
- ajouter la ligne suivante au fichier /etc/hosts: 127.0.0.1
<nom du projet>.local
Il est aussi possible d’utiliser Symfony2 dans NetsBeans. Pour cela
-
aller dans Outils->Option->php->Symfony2
Spécifier la localisation du fichier Symfony Standard 2.3.6 .zip
créer un nouveau projet en choissisant le framework Symfony2
Architecture
Architecture des fichiers :
Architecture divisée en plusieurs répertoires:
-
app: de dossier contient les fichiers de configurations, les caches, les fichiers des logs,
les paramétrages...
- src: les codes sources sont contenus dans ce dossier. Le code sera organisé en “bundles”( en
pack). celui-ci contient quelques fichiers d’exemples, fournis par Symfony2 qui pourront être
supprimés.
- vendor: Ce sont les librairies externes à l’application. On y trouveraDoctrine, Twig,
SwiftMailer (pour envoyer des emails)…
Librairie: Chaque librairie remplit une fonction bien précise, et dont on peut se servir dans notre
code. On ne sait pas comment elle fonctionne, mais on sait comment s'en servir. On pourra donc ce
servir très facilement de certaine chose(envoi de mail) simplement en apprenant à utiliser sa
librairie(SwiftMailer).
-
web: Ce sont les fichiers destinés aux visiteurs (images, fichiers css, javascript…) Il contient
également le contrôleur frontal app.php ou app-dev.php (l’équivalent d’index.php). C’est le
seul répertoire accessible aux visiteurs, les autres répertoires ne sont pas censés être
accessibles
. Les fichiers .htaccess interdisant l'accès aux autres dossiers.
Le controleur frontal
C’est le point d’entrée de l’application, toutes les pages y passent. le contrôleur frontal de
symphony2 se situe dans le répertoire web/ (app.php et app-dev.php)
4/17
app.php: controleur pour les visiteurs du site, on affiche pas les erreurs mais renvoie à la page
précédente
app-dev.php: controleur pour le développeur, aide pour le débogage
Ce sont deux environnements de travail.
5/17
Architecture conceptuelle :
Analyse du schéma :
Le visiteur demande la page /blog
Le contrôleur frontal reçoit la requête, charge le Kernel et la lui transmet
Le Kernel demande au Routeur quel contrôleur exécuter pour l'URL /blog. Ce Routeur est
un composant Symfony2 qui fait la correspondance entre URL. Le Routeur indique qu’il fut
exécuté le contrôleur SdzBlog
- Le Kernel exécute le contrôleur, qui demande au modèle article la liste des articles, et la
renvoie à la vue ListeArticle. La vue retourne a page HTML.
Les couleurs du schéma distinguent les points où il faut intervenir : Il faudra coder ce qui est en
vert, le reste est à configurer, on ne touche pas au controleur frontal.
-
6/17
BD
Concept des Bundle
Les bundle sont des sortes de brique, tous ce qui concerne une même fonctionnalité est regroupée
dans un bundle, mais les différents bundle doivent pouvoir coopérer. Un bundle peut être réutilisé
dans plusieurs projets.
Des bundles sont déjà fourni par la communauté sur http://knpbundle.com/
Structure des bundles
Un bundle est structuré en dossier, la structure conventionnelle est la suivante, mais elle peut être
modifiée:
Controller/
| Contient les contrôleurs.
DependencyInjection/ | Contient des informations sur le bundle (chargement automatique de
la configuration par exemple).
Entity/
| Contient les modèles.
Form/
| Contient les éventuels formulaires.
Resources/
-- config/
| Contient les fichiers de configuration du bundle
-- public/
| Contient les fichiers publics de votre bundle : fichiers CSS et JavaScript,
images, etc.
-- views/
| Contient les vues de notre bundle, les templates Twig.
Tests/
| Contient les éventuels tests unitaires et fonctionnels.
7/17
Création de Bundle
Il faut commencer par l’exécution de la commande php app/console generate:bundle
1. Choisir le namespace: la console propose de rentrer un namespace.
sdz correspond au namespace racine, le nom du bundle doit finir par “Bundle” par
convention
2. Choisir le nom: la console propose de rentrer un nom, même chose que le namespace sans le
« \ » le nom donné ar défaut est SdzBlogBundle, qui est à retenir
3. Choisir la destination
4. Choisir le format de configuration
YAML est bien adapté pour un Bundle
5. Choisir si Symfony se charge de générer toute la structure
6. Confirmez
8/17
On peut aussi générer un Bundle à partir de NetBeans : Clic Droit sur le projet Symfony2->Symfony2>Run Command->generate-bundle suivi des paramètre namespace ,dir, bundle-name, format,
structure
Supprimer le Bundle Demo
Supprimer le dossier acme,
supprimer la ligne
$bundles[] = new Acme\DemoBundle\AcmeDemoBundle(); dans le fichier app/AppKernel
suppirmer la ligne:
# AcmeDemoBundle routes (to be removed)
_acme_demo:
resource: "@AcmeDemoBundle/Resources/config/routing.yml"
Dans routing_dev.yml
Création d’une page avec Symfony2
Se situer dans le répertoire source du Bundle
Création de route
Afin de créer une page, il faut créer un fichier de routes, l’objectif d’une route(ou router) est
d’indiquer à Symfony 2 ce qu’il doit se passer quand un URL est appelé.
Un fichier de routes existe déjà dans Resources/config, il faut le compléter pour l’adapter à notre
page.
( ! L’indentation ne se fait pas avec tabulation mais avec 4 espaces.)
Il est possible de contrôler les paramètres d’une route, il faut ajouter la mention : requirements, les
paramètres qui ne rentre pas dans ces critères ne seront pas interprété et la page ne sera pas
trouvée :
Il est possible de mettre un préfixe pour toutes nos URL dans le fichier app/config/routing.yml
9/17
Création d’un contrôleur :
Il faut ensuite créer un contrôleur. Le nom des fichiers des contrôleurs doit respecter une
convention : commencer par le nom du bundle (Blog ici) et être suivi du suffixe « Controller ». Un
contrôleur est créer par défaut mais on peut en créer un autre.
Contenu d’un contrôleur :
Il est possible de générer les URL : dans la fonction indexAction du controleur, on utilise la fonction
generateUrl avec le nom de la route et les paramètres à utiliser si il y en a.
ex :
$url = $this->generateUrl(‘sdzblog_voir’,array(‘id’=>$id)) ;
Dans le controleur il est possible d’utiliser des « services » on les appelle par la fonction get(). ex :
$this->get(‘mailer’) permet l’envoi d’e-mail. Pour les e-mail i faut alors modifier les paramètre dans le
fichier app/config/parameters
Création du Template :
Moteur de template : script qui permet d’utiliser des fichiers qui ont pour but d’afficher le contenu
d’une page html sans php. Le répertoire des templates est Ressources/views.
Dans views : le nom du répertoire sera le même que celui du contrôleur et le nom du fichier
correspondra à une action du contrôleur.
src/Sdz/BlogBundle/Resources/views/Blog/index.html.twig
10/17
Appelle de la vue dans le contrôleur :
On peut rajouter d’autre paramètre dans la fonction render et modeifier la vue en conséquence :
exemple
<h1>Hello {{ nom }} !</h1> dans la vue
return $this->render(‘SdzBlogBundle :Blog :index.html.twing’, array
(‘nom’=>’test’) ) ; dans le contrôleur
On peut aussi générer l’Url à partir de la vue avec la fonction {{ path }}
ex :
<a href="{{ path('sdzblog_voir', { 'id': article_id }) }}">Lien vers l'article d'id {{ article_id }}</a>
Avec Symfony il faut penser à vider le cache régulièrement car des erreurs qui ne sont pas de notre
ressors peuvent apparaître après une modification pour cela il faut utiliser la commande : php
app/console cache :clear (pour la partie dev) , php app/console cache :clear --env=prod (pour la
partie prod)
11/17
Formulaire
Utilisation d’un composant « Form » fournit avec Symfony2 : les formulaires ont besoin d’objet pour
être construit. Il permettent de remplir les attributs de l’objet avec des valeurs entrées par le
visiteur.
On utilise alors un formBuilder(constructeur de formulaire). Tout d’abord on définit l’objet concerné
par le formulaire, puis on définit les attributs qui seront "remplis"
// On crée le FormBuilder grâce à la méthode du contrôleur
$formBuilder = $this->createFormBuilder($article);
// On ajoute les champs de l'entité que l'on veut à notre
formulaire
$formBuilder
->add('date',
'date')
->add('titre',
'text')
->add('contenu',
'textarea')
->add('auteur',
'text')
->add('publication', 'checkbox');
On génère ensuite le formulaire, puis on le transmet à la vue, il est alors visible mais pas
opérationnel.
// À partir du formBuilder, on génère le formulaire
$form = $formBuilder->getForm();
// On passe la méthode createView() du formulaire à la vue afin
qu'elle puisse afficher le formulaire toute seule
return $this->render('SdzBlogBundle:Blog:ajouter.html.twig',
array(
'form' => $form->createView(),));
Dans la vue il faut ajouter de quoi remplir le formulaire :
<form method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submit" class="btn btn-primary" />
</form>
Les type de champs de formulaire doivent correpondre au types des attributs pour permettre une
bonne insertion dans la base de données.
Pour créer des formulaires on peut aussi utiliser la console pour générer des CRUD.
12/17
Doctrine2
Doctrine 2 est aussi un Framework, il permet de faire le lien entre la base de données et le code sans
utiliser de classe modèle et en minimisant les requête SQL. On utilise des annotations sur les classes
pour définir qu’elles seront les colonnes des tables, le lien entre les table… Les classes deviendront
des tabes. Doctrine emploi le terme d’entité pour définir une table.
Les annotations commence par /** et finissent par */
Annotations à connaître :
/** @Entity */ : à placer avant de définir une classe. Permet d’indiquer que cette table sera une
entité et donc pourra générer une table dans le SGBD
/**
* @Id @Column(type="integer", name="id_adr")
* @GeneratedValue
*
*/ : Il faut créer un attribut dans la classe qui sera la clé primaire de la table
/**
* @Column (type="string", length=200, name="rue_Adr")
*/ : Indique que cet attribut est un champ de la table, à utiliser pour chaque attribut
Il faut aussi représenter les associations qu’il y a entre les classes :
/**
*@OneToOne(targetEntity= "Adresse")
*/ : se place avant l’attribut concerné. Cette annotation traduit une association 1..1 Si l’on rend
l’exemple d’un client qui habite une certaine Adresse. Adresse et Client étant deux objets. Adresse
est un attribut de client. L’annotation sera placer avant l’attribut Adresse dans la classe Client et
l’entité cible sera Adresse.
/**
* ManyToOne(targetEntity=" Article")
*/ : La relation Many-To-One d’associer plusieurs entité à une seule. Si l’on prend l’exemple des
commentaires dans un blog, plusieurs commentaires correspondront à un seul article. Cela se traduit
par cette annotation, située dans la classe Commentaire au-dessus de l’attribut article.
/**
*ManyToMany(targetEntity=" Categorie", cascade={"persist"})
*/ : Many-To-Many traduit une association n..n si l’on prend l’exemple des articles et des catégories
dans un blog, un article peut correspondre à plusieurs catégories et une catégorie peut posséder
plusieurs articles. On met alors cette annotation au-dessus de l’attribut correspondant dans l’une des
deux classes.
Après avoir annoté toutes les classes qui sont maintenant considérées somme des entités par
Doctrine on peut générer la base de données. Il faut d’abord indiquer les paramètres d’accès à la
base de données dans le fichier.
13/17
On peut générer automatiquement des entités avec la commande php app/console
gen:doctrine:entity
Exemples
Création d’un projet Symfony : recette,
Après avoir suivi toute les étapes d’installation de Symfony, configuration pour prise en compte de la
base de données :
14/17
Génération du Bundle recette :
btssio@btssio-VirtualBox:~/NetBeansProjects/recette$ app/console generate:bundle
Welcome to the Symfony2 bundle generator
Your application code must be written in bundles. This command helps
you generate them easily.
Each bundle is hosted under a namespace (like Acme/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).
See http://symfony.com/doc/current/cookbook/bundles/best_practices.html#index-1 for more
details on bundle naming conventions.
Use / instead of \
for the namespace delimiter to avoid any problem.
Bundle namespace: Sdz/recetteBundle
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 SdzrecetteBundle.
Bundle name [SdzrecetteBundle]:
The bundle can be generated anywhere. The suggested default directory uses
the standard conventions.
Target directory [/home/btssio/NetBeansProjects/recette/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
Summary before generation
You are going to generate a "Sdz\recetteBundle\SdzrecetteBundle" bundle
in "/home/btssio/NetBeansProjects/recette/src/" using the "yml" format.
Do you confirm generation [yes]? 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!
Suppression du Bundle AcmeDemoBundle et de tous ce qui le concerne
Création d’une base de données recette
15/17
Génération de deux entités avec Doctrine : gen :doctrine :entity, Recette et Ingredient
Génération de la base de données avec les annotations
Génération d’un formulaire pour chaque entité avec la commande app/console
generate :doctrine :crud
Les formulaires sont maintenant créés on peut entrer des informations dans la base de données.
16/17
Il faut ensuite mettre en forme les formulaires pour les rendre plus esthétiques
17/17