Clementine est un framework MVC pour PHP, c'est un logiciel libre sous licence MIT.
Clémentine est partie d'une frustration : quand on importe des librairies dans un projet web, on doit souvent les adapter à notre besoin. Et il n'est pas toujours facile de le faire proprement.
Même lorsqu'elles ont été conçues pour être flexibles, avec des hooks par exemple, on finit souvent par tomber sur un cas qui n'a pas encore été prévu. Par exemple ce hook qui nous aurait bien arrangé mais qui n'existe pas encore.
Dans des cas un peu plus favorables, on peut utiliser de l'injection de dépendances.
On étend alors les librairies importées en utilisant des classes dérivées, afin de surcharger certains comportements et on injecte nos instances de classes dérivées plutôt que de classes d'origine... si l'injection de dépendances a été prévue à l'endroit qui nous intéresse. Mais ce n'est malheureusement pas toujours le cas.
On se retrouve alors à devoir modifier le code source des librairies qu'on a importées. Et là, c'est le drame : on ne peut plus suivre facilement les mises à jour.
Et si un framework s'occupait d'utiliser automatiquement nos classes dérivées partout, à la place des classes d'origine ? Plus besoin de modifier le code source des classes qu'on a importées ! Nos modifications restent dans leurs propres fichiers, elles sont prises en compte automatiquement, et on peut mettre à jour plus sereinement les librairies importées.
L'expérience Clémentine était née.
Cette expérience a pris pour terreau un framework MVC inspiré de Zend Framework, pour devenir un outil resté simple, mais mature.
- Pas de code généré, pas de fichiers de cache dont on ne retrouve plus la source : on reste sur du code interprété, plus facile à maintenir.
- Debug facilité : pour que vous trouviez rapidement cette requête SQL, ou pour que vous ne laissiez plus passer la moindre Notice (vous pouvez en recevoir une trace par e-mail).
- Dans Clémentine, tout fonctionne sous forme de modules, même le coeur du framework... et tous les modules sont surchargeables, y compris les surcharges.
Le framework garantit de toujours pouvoir intercaler une classe à n'importe quel niveau de l'héritage.
Comme on y prend vite goût, on a utilisé le concept partout :
- fichiers de configuration
- contrôleurs
- modèles
- vues
- controleurs
- helpers
On peut même utiliser l'héritage sur des modules (tout ou partie) en quelques lignes.
Par exemple si vous avez
class Robin extends Batman
Clémentine vous permettra d'injecter une classe Joker entre les deux, sans modifier une seule ligne de Robin ni Batman, et le framework comprendra automatiquement que :
class Robin extends Joker
class Joker extends Batman
Et si besoin, vous pouvez même changer l'ordre d'héritage des classes comme vous trieriez des calques dans Photoshop.
Ce n'est pas parce qu'on n'utilise pas de code généré ou de fichiers cache que ça doit ramer... et ça ne rame pas du tout, promis !
Pour l'exemple : une page "hello world" est rendue en 2ms
. Ça ne vaut sans doute pas un benchmark approfondi mais ça donne une idée du temps pris pour faire tourner le framework lui même.
- Pour une première installation
- Pour la gestion des mises à jour des modules et migrations de la base de données
- Pour la gestion des dépendances. Vous pouvez choisir d'imposer les versions de modules (si vous n'êtes pas prêt pour un passage de version majeure) : l'installeur choisira les versions des autres modules de manière à respecter ces choix sans casser la compatibilité
- Vous pouvez même utiliser votre propre dépôt de modules si vous voulez
Et laissez vous guider pour installez vos premiers modules !
- Récupérez la dernière version et décompressez la dans un dossier my_directory
- Pointez votre navigateur sur my_directory et laissez vous guider par l'installeur : http://localhost/my_directory/