Utiliser Doctrine au lieu de Propel dans Symfony sous Ubuntu
Par NiKo le dimanche 7 janvier 2007, 18:45 - Dev
- Lien permanent -
9 commentaires -
Tags :
Doctrine est une couche ORM rapide et performante, basée sur le pattern ActiveRecord bien connu des adeptes de Ruby on Rails, pouvant être utilisée en lieu et place de Propel, l'ORM natif embarqué avec Symfony par défaut.
Installation
La mise en place de Doctrine se présente sous la forme d'un plugin, sfDoctrine, qui s'installe via un checkout Subversion dans le répertoire plugins de votre projet Symfony, comme suit :
$ cd /path/to/project/plugins $ sudo apt-get install subversion $ svn co http://svn.symfony-project.com/plugins/sfDoctrinePlugin sfDoctrinePlugin
Note: Si votre projet est déjà versionné dans un dépôt Subversion, vous pouvez faire un svn:externals vers le plugin :
$ propset svn:externals "symfony http://svn.symfony-project.com/plugins/sfDoctrinePlugin" /path/to/project/plugins
L'avantage est que desormais vos svn up mettront à jour les fichiers du plugin d'un même coup.
Ceci fait, il faut installer PDO et son driver MySQL via PECL sur votre système si ce n'est pas déjà le cas :
$ sudo apt-get install build-essential php5-dev php-pear libmysqlclient12-dev $ sudo pecl install PDO PDO_MySQL
C'est un peu long, puisque compilé à la volée. Il ne faut pas oublier d'activer notre nouvelle extension et son driver dans nos fichiers différents php.ini :
$ sudo vi /etc/php5/apache2/php.ini /etc/php5/cli/php.ini
Et ajoutez en toute fin de fichiers les deux lignes suivantes :
extension=pdo.so extension=pdo_mysql.so
Configuration
Maintenant, définissons nos paramètres de connexion pour le projet monprojet dans le fichier ./config/databases.yml du projet :
all:
monprojet:
class: sfDoctrineDatabase
param:
dsn: mysql://user:pass@localhost/mydb
Ensuite, on va tester une structure de données assez simpliste (au pif et pour faire original, un blog), pour vérifier que ça marche. On édite le fichier ./config/doctrine/monprojet.yml :
User:
tableName: users
columns:
name: string(20)
created_at: timestamp
Article:
tableName: articles
columns:
title: string(255)
exerpt: text
description: text
created_at: timestamp
user_id:
foreignClass: User
foreignName: author
localName: article_author
onDelete: cascade
Comment:
tableName: comments
columns:
content: text
created_at: timestamp
user_id:
foreignClass: User
foreignName: commenter
localName: comment_user
onDelete: cascade
article_id :
foreignClass: Article
localName: comment_article
onDelete: cascade
On peut maintenant générer les classes du modèle objet précedemment défini :
$ symfony doctrine-build-model
Ce qui nous donne :
>> loading Class descriptions from "/home/...m/config/doctrine/monprojet.yml" >> writing BaseUser.class.php >> writing BaseArticle.class.php >> writing BaseComment.class.php
Ces fichiers ont été créés sous ./lib/model/doctrine automatiquement. Vous pourrez modifier les classes objets pour les adapter à vos besoin, mais attention, les classes de base situées dans le sous-répertoire generated seront systématiquement écrasées à chaque regénération.
Utilisation
Les commandes de scaffolding propres à Symfony et Propel ont été adaptées partiellement à Doctrine ; vous trouverez ainsi quelques tâches utiles :
doctrine-export > exports doctrine schemas to propel schema.xml doctrine-generate-crud > Creates Doctrine CRUD Module doctrine-import > converts propel schema.*ml into doctrine schema doctrine-init-admin > initialize a new doctrine admin module
Pour aller plus loin
La syntaxe de requêtage et les autres aspects de Doctrine sont détaillés dans les ressources suivantes :
9 commentaires (Ajouter un commentaire)
AAaaaahh ben voilà un article que je vais bookmarker tout de suite. Après avoir pas mal galérer pour l'installer, c'est toujours bon d'avoir le détail d'une install sous la main
Merci
Le seul défaut que je pourrai reprocher à doctrine c'est la maigre documentation sur son utilisation avec symfony. Ce n'est pas assez détaillé je trouve mais c'est déjà bien qu'il y en est un petit peu
Voila qui va être utile à des tas de gens.
Néanmoins, vivement que propel passe à l'utilisation de PDO pour gagner en perfs, comme ça on sera plus obligé de passer sur doctrine
C'est vrai que la doc du plugin est vraiment succinte, c'est dommage. Mais je trouve la documentation de Doctrine en elle-même plutôt bien fournie, et agréable à compulser.
La vraie question est celle de la pérennité de cette couche ORM, dans la mesure où elle n'est développée et maintenue que par une unique personne...
Croisons les doigts .. !
Mais il suffit de populariser son installation via des tutos comme les tiens pour le faire connaître et ainsi (peut être) augmenter les développeurs autour de doctrine.
Pour la perrénité de doctrine à mon avis il n'y a pas de soucis, car manifestement il est parti pour intégrer PEAR :
http://article.gmane.org/gmane.comp...
http://article.gmane.org/gmane.comp...
http://article.gmane.org/gmane.comp...
arnod'mental> C'est de la grosse balle, cette news
Tu m'étonnes. Je reve d'un Structures_DataGrid_DataSource_Doctrine et d'un Doctrine_FormBuilder :o
Espérons que cela ne prenne pas trop de temps, le processus d'intégration d'une librairie php5 chez PEAR est un peu usinagazesque.
Tu m'étonnes que c'est long, d'ailleurs j'ai toujours un proposal en cours. Qui le restera probablement à jamais !
Merci beaucoup.
Je suis en train de chercher a changer de framework et cette combinaison me parait vraiment toute indiquée.