mar
27
2011

par Paul
chat

Une petite modification mineur du source a rendu possible d’insérer le chat dans d’autre page web:

<iframe src="http://wayr.org/LeNomDuSalon?display=embedded"></iframe>


Je suis entrain de réécrire le code avec le Framework Symfony
Pourquoi ?

  • Pour voir si c’était possible
  • Une fois avoir tout réécrit avec Symfony, passer de MongoDB à MySQL.

Et pourquoi passer de MongoDB à MySQL? Juste pour comparer les performances.

Symfony ne gérant pas les bases de données NoSQL (ici MongoDB), je dois aussi écrire la partie qui stocke en BD.
Ce n’est pas super compliqué vu que j’ai préféré ne pas crée un « vrai » ODM, mais je fais juste hériter mes modeles d’une classe qui se charge des ajouts/modifications/suppressions.

Ce qui donne du genre:
WhispsMessage hérite de MongoMessage qui hérite de Message

  • WhispsMessage ne sert qu’à « typer » les objects dans le code, que ce soit avec MongoDB ou MySQL.
  • MongoMessage qui gère l’implémentation spécifique à MongoDB.
  • Message est une classe abstraite qui rassemble les méthodes commune aux différentes BD.

J’avoue que ce point est encore un peu flou dans ma tête.

Le plus gros problèmes que je rencontre, c’est écrire les modeles de tel façon à ce que le changement de MongoDB à *SQL soit très simple.
Du coup la réutilisation des classes/objets/fonctions qui n’interagissent pas avec la BD est plus complexe, car j’avais un peu fait ça comme un porc.

En effet, j’avais l’habitude de faire:

$monDocument->champsDuDocument = 'foo';

Ce qui ne pose aucun problème si on change de BD, sauf quand il s’agit de liaison entre les tables.
Avec MongoDB, les relations entre les « collections » je les gérais directement dans le document.

Pour simplifier je faisais du genre:

//$document1 dans la collection1
//$document2 dans la collection2
$document1->$collection2 = array($document2->id);
$document2->$collection1 = array($document1->id);

Je n’ai pas changé ma façon de gérer les relations (vu que le but c’est de refaire à l’identique dans un premier temps).
Par contre, j’ai crée des méthodes spécifique pour les gérer.

$document1->linkWith($document2);
$document1->linkWith($document3);
$document1->unlinkWith($document2);

$documents = $document1->getAllLinks();
//$documents[0] == $document3

Au final ça ne change rien si ce n’est que lors du passage à MySQL, je n’aurais que ces méthodes à réécrire (à priori).


En écrivant ces lignes je me rends compte que ce n’est pas très clair donc ça ne doit pas être la meilleure solution.
Mais le but ultime est vraiment de passer à MySQL et donc d’utiliser les fonctionnalités de l’ORM Doctrine.