Quel framework pour le dével haut niveau et modulaire ?
Dans le cadre d'un projet personnel (mais d'une certaine ampleur), je suis à la recherche d'un framework PHP, de préférence gratuit et/ou open source qui, à la fois, permette de la modélisation de relativement haut niveau, et qui soit adapté pour la conception d'une application modulaire.
1.
Ce que j'entends par "modélisation d'un niveau relativement haut" c'est la chose suivante :
Imaginons que je veux manipuler des autorisations d'accès (à des fichiers) qui ont une certaine période de validité, je voudrais que ma classe "AccessAuthorization" ait (notamment) deux propriétés : "user" et "period", respectivement d'un type (dont les données proviennent généralement d'une table MySQL) implémentant l'interface "IUser" et d'un type "Period" (définie, par exemple, par date de début et date de fin).
J'aimerais pouvoir accéder à ces propriétés de cette manière :
Code:
$accessAuthorization->user
et
Code:
$accessAuthorization->period
J'aimerais ensuite les manipuler sans voir à m'inquiéter :
- de la classe exacte utilisée pour la propriété "user" (du moment qu'elle dérive de IUser)
- de la manière exacte dont est implémentée la classe "Period" (ça peut être une date de début et une date de fin, ou bien une date de début et une durée, etc. )
En particulier, je ne veux pas avoir à écrire la moindre instruction SQL, notamment pour créer les tables à l'installation de l'application (du moment que je déclare explicitement les propriétés que je souhaite voir dans chaque classe, bien entendu).
Je voudrais pouvoir faire des requêtes de haut niveau, du style :
Code:
1 2
| $query=$this->period->isInside($period); // création d'une requête
$accessAuthorizations=$this->get($query); // exécution de la requête |
Dans l'exemple ci-dessus, je demande la liste des autorisations dont la propriété "period" est comprise dans une $period donnée.
Cette écriture de haut niveau me permet de requêter sur des types complexes sans connaître leur implémentation ou leur représentation dans les tables SQL.
Il me suffit de connaître (ou de retrouver) les méthodes du style "isInside()" mises à disposition par celui qui a développé le type "Period", ce qui me paraît plus simple (notamment avec la future gestion des propriétés PHP __get() dans le bloc PHPDoc dans Eclipse PDT qui permettra de donner la liste des méthodes disponibles sous forme de code assist) et surtout plus sûr, mais tous les goûts sont dans la nature :mrgreen: .
2.
Ce que j'entends par "adaptée pour une application modulaire" c'est, par exemple, la possibilité d'obtenir un objet représentant l'utilisateur courant en écrivant quelque chose du style :
Code:
1 2 3 4 5 6 7 8
| interface IUserManager {
/**
* Get current user
* @return IUser
*/
function getCurrentUser();
}
$application->getModule('IUserManager')->getCurrentUser(); |
Je demande à l'application (ou équivalent) de me procurer un module actif implémentant l'interface "IUserManager", et je demande à ce dernier de me procurer l'utilisateur courant. Cette approche permet de remplacer le module gérant les utilisateurs sans impacter le reste du code.
Typiquement la méthode "getModule()" est fournie par le framework (qui dit framework adapté pour faire des applications modulaires, dit gestion du cycle de vie des modules même si, en PHP, la vie d'un objet est souvent assez brève... ;) )
Ou encore la possibilité, lorsqu'on écrit un module qui a besoin de paramètres de configuration, de simplement lui faire implémenter une interface du genre
Code:
1 2 3
| interface IParametrable {
function getParameterDefinitions();
} |
et un module d'administration, fourni par moi-même ou par un tiers, générerait automatiquement le panneau d'administration de mon module.
Ne trouvant pas rapidement un framework qui réponde à ces critères, j'ai déjà commencé à faire des choses par moi-même (en particulier les exemples que je donne ci-dessus sont pratiquement gérés, dans mon mini-framework personnel) mais, maintenant que je vois comment aborder le problème, j'aimerais me recaler sur quelque chose d'existant. Soit pour consolider ce que j'ai commencé à faire soit, carrément, pour basculer.