J’ai commencé hier à implémenter un constructeur de requête SQL, histoire de voir s’il y avait moyen d’alléger le code côté Dotclear, d’une part, et d’autre part de s’affranchir des particularités propres aux différents gestionnaires de base de données (MySQL, PostgreSQL, SQLite).
Ça commence à fonctionner comme je le souhaite, sachant que pour l’instant je me suis largement inspiré de cette librairie.
Cela dit, au moment de commencer à écrire les tests unitaires associés, je me demande si l’écriture n’est pas un poil trop lourde et verbeuse.
Exemple :
$sql = dbQuery::make($con)
->from('mytable')
->where(dbQueryConditions::make($sql, 'id = ?', 1))
->select();
Qui pourrait aussi s’écrire de cette façon (sans utiliser les fonctionnalités de paramètres injectés dans les expressions) :
$sql = dbQuery::make($con)
->from('mytable')
->where(dbQueryConditions::make($sql, 'id = 1'))
->select();
Pour obtenir in fine une requête SQL qui ressemble à (avec le driver MySQLi) :
SELECT * FROM `mytable` WHERE id = 1
Z’en dites ?
Cela dit, en utilisant les possibilités d’alias des namespaces, on devrait pouvoir aussi écrire ça comme ça :
use \dbQuery as sql;
use \dbQueryConditions as sqlCond;
$sql = sql::make($con)
->from('mytable')
->where(sqlCond::make($sql, 'id = 1'))
->select();
Du coup ça devient un poil moins lourd à lire.
1 De Nicolas -
Perso, je suis de moins en moins fan des abstractions même si je comprends bien l’intérêt.
2 De Franck -
Disons que dans ce cas particulier on évite les écueils liés aux particularités des syntaxes SQL des différents gestionnaires qu’on supporte (MySQL, PostgreSQL et SQLite).
D’autre part, ça ajoute un peu de souplesse pour certaines compositions de requête, je pense entre autres à celle qui est construite quand on recherche des billets, qui est assez « usine à gaz » dans Dotclear. Cela dit, l’implémentation que j’ai pour l’instant faite n’est pas encore assez pratique pour ça, mais ça va venir.
Par ailleurs pour un développeur de plugin (ou de thème d’ailleurs), ça simplifie peut-être l’écriture ou a minima la relecture ultérieure.
Quant à l’abstraction, c’est déjà ce qu’on fait côté Dotclear avec les templates (sans PHP à l’intérieur), du coup je pense que ce n’est pas plus mal de faire pareil côté accès aux données.
Pour l’instant il faut que je termine les tests unitaires et je pousse tout ça sur le dépôt.