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 :
et
Code : Sélectionner tout - Visualiser dans une fenêtre à part $accessAuthorization->user
J'aimerais ensuite les manipuler sans voir à m'inquiéter :
Code : Sélectionner tout - Visualiser dans une fenêtre à part $accessAuthorization->period
- 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 :
Dans l'exemple ci-dessus, je demande la liste des autorisations dont la propriété "period" est comprise dans une $period donnée.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 $query=$this->period->isInside($period); // création d'une requête $accessAuthorizations=$this->get($query); // exécution de la requête
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.
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 :
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 interface IUserManager { /** * Get current user * @return IUser */ function getCurrentUser(); } $application->getModule('IUserManager')->getCurrentUser();
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 genreet un module d'administration, fourni par moi-même ou par un tiers, générerait automatiquement le panneau d'administration de mon module.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 interface IParametrable { function getParameterDefinitions(); }
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.
Partager