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 : , ,

4 Réponses à “Symfony: Mettre ses tables en UTF8 avec Doctrine (même les plugins)”

  1. Nil a dit:

    Sympa comme astuce ! Tu peux aller voir aussi http://blog.samuel-trocme.fr qui donne des tips aussi ! Je viens de rajouter ton flux dans mes RSS :)

  2. Quiche a dit:

    une autre façon de faire, dans le fichier de conf my.cnf de mysql ajouter les lignes suivante après [mysqld]
    default-character-set=utf8
    default-collation=utf8_unicode_ci
    character_set_server=utf8
    collation_server=utf8_unicode_ci
    default-storage-engine=INNODB

    du coup, toutes les bases et tables créées sans spécification du CHARACTER SET, COLLATE et ENGINE seront en
    DEFAULT CHARACTER SET utf8
    COLLATE utf8_unicode_ci
    ENGINE = INNODB

  3. mikeplavo a dit:

    Voici la solution que j’utilise et qui fonctionne:
    Rajouter dans le fichier config/ProjectConfiguration.class.php le code suivant:
    public function configureDoctrine(Doctrine_Manager $manager)
    {
    $manager->setCollate(‘utf8_unicode_ci’);
    $manager->setCharset(‘utf8′);
    }
    et hop, tout fonctionne.

  4. Renaud a dit:

    Merci beaucoup mikeplavo pour cette astuce !

    Je m’en servirais la prochaine fois :)

Laisser une réponse