29 juin 2009

Symfony: Mettre ses tables en UTF8 avec Doctrine (même les plugins)

Category: UncategorizedRenaud @ 20h06

Pour mettre ses tables en UTF8 avec Doctrine et le framewok Symfony, rien de plus simple.

Tout en haut de votre(vos) schema.yml, ajoutez les lignes suivantes:

options:
  collate: utf8_unicode_ci
  charset: utf8

Malheureusement, les fichiers schema.yml des plugins ne seront pas affecté car il faut que ce bout de code soit répété en haut de chaque schema.yml.

Heureusement, [MA]Pascal m’a donné une astuce de sioux qui permet de résoudre ce problème. Il suffit d’utiliser l’héritage des tables dans Doctrine. Par exemple, voici ce que ca donnerait pour le plugin sfDoctrineGuardPlugin:

sfGuardGroupUtf8:
  inheritance:  { extends: sfGuardGroup, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardGroupPermissionUtf8:
  inheritance:  { extends: sfGuardGroupPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardPermissionUtf8:
  inheritance:  { extends: sfGuardPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardRememberKeyUtf8:
  inheritance:  { extends: sfGuardRememberKey, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserUtf8:
  inheritance:  { extends: sfGuardUser, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserGroupUtf8:
  inheritance:  { extends: sfGuardUserGroup, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

sfGuardUserPermissionUtf8:
  inheritance:  { extends: sfGuardUserPermission, type: simple }
  options:      { collate: utf8_unicode_ci, charset: utf8 }

[MA]Pascal me disait même qu’il étendait les fonctionnalités des plugins de cette façon, mais je ne sais pas dans quelle mesure on peut étendre une classe d’un plugin et espérer que cela fonctionne encore…

[MA]Pascal, si tu passes par là et si tu veux bien nous expliquer :p

Mots-clefs : , ,


14 fév 2009

Symfony: bench des ORM Propel et Doctrine

Category: UncategorizedRenaud @ 15h01

Symfony, pour ceux qui ne connaissent pas encore, est un framework PHP puissant et français, développé par Sensio Labs.

Contrairement à d’autres framework qui réinventent la roue, symfony s’appuie sur des librairies externes qui ont fait leur preuve. C’est précisément le cas pour l’ORM.

Dans ses premières versions, symfony n’intégrait que Propel et le changement d’ORM était relativement difficile, malgré l’existence d’un plugin Doctrine, car certains outils du framework, notament l’Admin Generator, s’appuyait uniquement sur Propel.

Depuis la version 1.1, Propel est un plugin et ne fait plus parti du core de symfony. Depuis la version 1.2, l’Admin Generator peut utiliser indifféremment Propel ou Doctrine. C’est une très bonne nouvelle pour la communauté. Du coup, chaque développeur peut choisir l’ORM qui lui convient le mieux… mais aussi se poser la question fatidique « Quel est le meilleur ORM ? »

Cette question, je me la suis, moi-même posée.

Pour y répondre, il faut prendre en compte plusieurs points (liste non exhaustive et non ordonnée):

  • la facilité d’apprentissage
  • la rapidité de développement
  • les capacités offertes par l’ORM (vs les besoins qu’on a)
  • la rapidité d’exécution

Et c’est sur ce dernier point (pas forcément le plus important) que je suis me suis penché car j’ai lu à divers endroits que Doctrine était sacrément plus lent que Propel.

J’ai donc commencé à faire quelques benchmark. Ou plutôt une « plateforme » de benchmark qui n’attend que vous pour être complétée. En effet:

  • étant débutant avec symfony, propel et doctrine, je ne peux garantir que tout soit bien optimisé, j’ai donc besoin de l’aide de demi-dieu de symfony et/ou propel et/ou doctrine
  • à plusieurs nous arriverons mieux à faire un benchmark suffisamment complet et représentatif du type de requête utilisé dans un site web.

J’ai donc publié le code sur googlecode et l’accès au svn vous sera ouvert sur simple demande (mail/msn/gtalk de contact en haut à droite de ce blog).

url du projet: http://benchsymfonyorm.googlecode.com

Le projet contient un répertoire pour chaque ORM avec, à l’intérieur, un projet symfony.

J’ai séparé chaque ORM dans un projet différent car l’utilisation de Propel et Doctrine pourrait fausser les résultats.

Les benchs sont tous dans des task afin que le serveur web n’influe pas sur les résultats.

Les remarques constructives sont évidemment les bienvenues. Les trolls velus totalement interdits et carrément supprimés des commentaires s’ils montrent le bout de leur nez.

Comme dit plus haut, je ne prétends pas avoir faire un système parfait et les améliorations sont donc les bienvenues… en fait, c’est un peu le but de ce projet :)

Mots-clefs : , , , , ,