Propel, la puissante couche d’abstraction de Symfony
3 octobre 2008Comme je l’avait mentionné dans l’article sur l’architecture MVC, Symfony s’appuie grandement sur la couche d’abstraction de données « Propel» (on peut modifier cette couche par « Doctrine» par exemple). C’est certainement l’une des parties les plus importantes du Framework Symfony. Propel vous fait gagner un temps fou dans la manipulation des données issus de vos bases de données.
Que est-ce qu’une couche d’abstraction de données ?
D’un point de vue matériel, une couche d’abstraction est l’ensemble des pilotes permettant aux applications d’accéder facilement aux différents périphériques. De la même manière, une couche d’abstraction de données vous permet d’accéder à vos bases de données de façon très simple et complètement indépendante du SGBD.
La puissance de propel :
La meilleure manière d’illustrer cette puissance est de faire un petit tutorial Symfony qui fera les actions suivantes : création de la base de données et des structures de données permettant l’accès à votre base et ceci en 5 minutes.
Alors pour faire tout ceci, la seule « véritable tache» après avoir créé votre projet Symfony et votre application (ceci a déjà été abordée dans la deuxième partie de l’article concernant l’installation de Symfony) est de décrire la structure des de vos données (les tables de votre base de données).
Ceci peut être fait de deux manière, l’XML ou bien le YAML qui est le langage de spécification de base de Symfony (ne vous inquiétez pas, ce n’est pas un autre langage à apprendre, c’est le plus simple de tous les langages de spécifications). La structure de vos données sera donc écrite dans le fichier schema.yml (ou schema.xml) qui se trouve dans le dossier config de votre projet Symfony.
Exemple de schema ( /votreProjet/config/schema.yml) :
propel:
patient:
&nbps;&nbps;id :
nom : varchar
prenom : varchar
date_naissance : date
notes : text
visite:
id :
motif : varchar
date_visite : date
Ensuite vous devrez créer une base de données que vous nommerez par exemple « maBDD» . Il reste ensuite à configurer Symfony pour qu’il sache accéder à cette base de donnée. Ceci se fait dans deux fichiers principaux. Tout d’abord le fichier « databases.yml» et le fichier « propel.ini» présents dans le dossier config de votre projet.
Exemple de fichier (/MonProjet/config/databases.yml) :
all:
propel:
class: sfPropelDatabase
param:
dsn: mysql://user:pass@localhost/maBDD
encoding: utf8
Exemple de fichier (/MonProjet/config/propel.ini) :
propel.targetPackage = lib.model
propel.packageObjectModel = true
propel.project = votreProjet
propel.database = mysql
propel.database.createUrl = mysql://user:pass@localhost/
propel.database.url = mysql://user:pass@localhost/maBDD
&nbps;&nbps;
....
Voila maintenant, il ne vous reste plus qu’à taper quelques commandes, alors ouvrez votre terminal et accéder au dossier de votre projet symfony et ensuite tapez la commande suivante :
$ symfony propel:build-all
ou bien pour la version 1.0 de Symfony
$ symfony propel-build-all
Comprendre Propel et le model généré
La commande précédente effectue différentes taches répétitives pour chaque projet et vous fait donc gagner un temps énorme.
1- Elle crée un fichier SQL, qui contient le code de création de vos tables de base de donnée.
2- Elle exécute ce code SQL sur votre serveur de bases de données, c’est à dire qu’elle va créer vos tables dans votre base de données.
3- Le point le plus important, elle généré les différentes classes d’abstraction pour la manipulation de vos données sans à accéder directement à la base de donnée et sans utiliser de requêtes SQL. Il est à noter également que propel détecte instinctivement les relations entre vos différentes tables (comme la relation entre les visites et le patient dans notre exemple)
Pour chaque table, elle crée deux classes : La première (tablePeer) est celle permettant de manipulant les enregistrements, c’est à dire offrant un ensemble de primitives pour la sélection, la suppression … selon certains critères.
exemple :
<?php
$this->patients = PatientPeer::doSelect(new Criteria()); // Selection de tous les patients
?>
Et la deuxième représentant un enregistrement (un tuple), permettant d’accéder aux attributs, de les modifier, de sauvegarder l’enregistrement…
L’insertion d’un nouvel élément dans une table de base de données, reviendrai donc à créer un nouvelle objet, de remplir ses valeurs et de l’enregistrer
exemple :
<?php
$patient = new Patient();
$patient->setNom("Benguella");
$patient->setPrenom("Riad");
$patient->save();
?>
Voila mon but à travers cet article n’était pas de vous familiariser avec Propel (Et si vous avez un problème technique ou autre, n’hésitez pas à me contacter ou laissez un commentaire), mais surtout de vous montrer l’étendu de ses avantages et possibilités.
Remarque : Dans la nouvelle version de propel, quelques modifications affectent la configuration de Propel dans le fichier propel.ini : il faut par exemple utiliser « propel.database.creole.url» au lieu de « propel.database.createUrl»
Chargement ...

bassim
le 4 octobre 2008 à 18:33Salut, Saha aidkoum
T’as oublié l’essentiel sur Propel : c’est de préciser que c’est un outil ORM (Object-Relationnel Mapping) (voir Wikipedia)
youknowriad
le 4 octobre 2008 à 19:52@bassim je t’assure que ton commentaire m’a fait marrer. Ce que j’ai montré c’est justement c’est exactement ce que j’ai expliqué. Le fait d’utiliser des classes pour modeliser les bdd relationnels indépendemment du SGBD. (Ne le prend pas mal bassim, mais, tu critique toujours pour critiquer
)
bassim
le 4 octobre 2008 à 21:11tu ne m’as pas encore vu critiquer
C’était une suggestion. Je pense que nommer le concept englobant l’outil est important pour la compréhension du tutoriel. Et dans ce cas, dire que la technologie derrière tout ça est un outil qui facilite la transposition d’un modèle Objet vers un modèle Relationnel.
en PHP, le modèle Objet étant été introduit que très récemment, je suppose que beaucoup de lecteurs de ce blog ne connaissent pas encore les ORM, d’où ma suggestion.
Sinon si je commente un article, c’est que je le trouve déjà très interressant.
Cordialement !
youknowriad
le 5 octobre 2008 à 0:27@bassim merci alors pour le complément, et encore dsl.
rpsblog.com » A week of symfony #92 (29 september -> 5 october 2008)
le 6 octobre 2008 à 0:13[...] Propel, la puissante couche d’abstraction de Symfony [...]
Hugo
le 6 octobre 2008 à 11:51En PHP on utilise la flèche (->) et non le point (.) pour l’appel de méthode sur un objet
youknowriad
le 6 octobre 2008 à 13:06@Hugo oui c sur mais le but comme je dit était de montrer l’utilité de propel et non comment l’utiliser. Mais je corrige comme même, merci.
Symfony 1.2, les nouveautés | Youknowriad, blog du caméléon de l'informatique
le 2 décembre 2008 à 11:28[...] mais il ne remplace pas Propel, il faudra choisir votre configuration si vous voulez ce faire. Propel quand à lui passe à la version 1.3, offrant ainsi de meilleures [...]
inalgnu
le 14 janvier 2009 à 20:05ça ne serai pas propel.database.creole.url à la place de propel.database.createUrl
youknowriad
le 14 janvier 2009 à 21:08@InalGnu oui dans la nouvelle version, c’est propel.database.creole.url, J’ajoute une remarque à l’article tout de suite.
Merci
Stephane.p
le 3 mars 2009 à 16:09Bon article, par contre si tu écris comme ça ton fichier yml, tu risques d’avoir des soucis de parse file :).
youknowriad
le 3 mars 2009 à 16:52@Stephane T’a raison lol, je ne sais pour quel raison, les indentations ont disparues, je corrige ça illico