CakePHP est un framework open-source (
Licence MIT) écrit en PHP, inspiré de
Ruby On Rails et dont le but est de promouvoir le développement d'applications rapide (RAD en anglais) tout en proposant un cadre structuré et une certaine flexibilité. Attendue depuis des mois par sa communauté, la version 2.0.0 du célèbre framework est finalement sortie le 17 octobre plus d'un an après la sortie de la première alpha publique. Cette sortie marque un tournant majeur dans l'évolution du framework qui avait connu plusieurs moments troubles ces derniers mois (une partie de la core team avait migré vers un nouveau projet
Lithium) puisqu'en effet, cette version signe l'abandon définitif de PHP 4 au profit de PHP 5.2.9 notamment.
Présentation du framework
Comme beaucoup de ses concurrents,
CakePHP est un framework basé sur l'architecture
MVC et qui adopte la philosophie de la
convention plutôt que la configuration. Le but étant de proposer un certain nombre de conventions strictes tout en gardant une certaine flexibilité. Comme tous les frameworks dignes de ce nom, CakePHP embarque toutes les conditions de sécurités nécessaires et les outils pour gérer cookies, sessions,
ACL,
i18n etc...L'autre point fort de CakePHP est sa console qui permet en ligne de commande de générer ou plutôt de "cuisiner" (du nom de la commande "bake") du code : création des actions
C.R.U.D., des modèles de base, des vues basiques pour un seul but : la productivité et la rapidité permettant ainsi de se concentrer sur les actions "importantes" de vos applications plus que sur des tâches basiques maintes fois répétées.
Bien qu'étant moins connu en France que
Symfony par exemple, CakePHP reste un des
frameworks PHP ayant la plus grosse communauté (active) dans le monde. Souvent cité comme le juste milieu entre le moins complet mais plus flexible
CodeIgniter et le très complet mais un peu plus long à prendre en main Symfony, CakePHP a su se faire un nom au point qu'aujourd'hui, de nombreux gros projets l'utilisent. On pense notamment à
Mozilla Addons le site d'extensions de Firefox, l'un des sites les plus visités du web, Cake restant totalement accessible à des projets de taille plus modeste. Mais malgré ses nombreuses qualités, la version 1.3.X du framework souffrait de quelques défauts qui ont été corrigés dans cette version 2.0.
Les nouveautés ? Nouvelle recette ? Ou simple assaisonnement ?
Au vu de ce qu'a pu faire Sensio Labs avec Symfony, on aurait pu attendre de CakePHP une quasi refonte du code, il n'en est rien puisque cette nouvelle fournée est davantage une (bonne) évolution qu'une révolution. Quelques changements majeurs sont néanmoins à noter.
PHP est mort ! Vive PHP
Parmi ceux-ci, le changement principal est l'abandon total du support de PHP 4. Le reproche majeur qui était fait à CakePHP jusqu'alors était sa compatibilité avec PHP 4 expliquée par une volonté de toucher "tous les publics et tous les hébergeurs ". Malheureusement, ce choix de développement avait des conséquences sur la lourdeur et la rapidité d’exécution du code. Dorénavant, CakePHP est uniquement compatible avec les versions supérieures ou égales à PHP 5.2. Néanmoins, sachez qu'à l'heure où je vous parle les versions 5.3+ PHP et leurs fameux namespaces et lambdas, ne sont toujours pas complètement supportées par le framework.
Bien que le choix de non support de 5.3+ soit surprenant (mais sûrement là aussi expliqué par des contraintes d'hébergeurs), la
core-team s'est dite ouverte à un passage sur 5.3. Comme le prouve une autre nouveauté puisqu'il y a eu un remaniement des conventions en vue de préparer un passage à PHP 5.3+. Ainsi, fini les "underscore", place maintenant au "
CamelCase" ainsi
votre_super_controller.php deviendra
VotreSuperController.php. Autre exemple des nouvelles conventions: les
helper ou
components par exemple se verront clairement identifiés. Ainsi, un
helper :
Form.php deviendra désormais
FormHelper.php (respect des normes PSR-0 pour les puristes).
Une nouvelle arborescence pour plus de performances

Ce n'est pas tout au niveau des conventions, l'arborescence a également été revue. De l’aveu même des développeurs, jusqu'alors la manière dont les fichiers et les dossiers étaient organisés n'était pas assez strict et surtout, elle n'était pas spécialement tout le temps logique. Par exemple l'
app_controller (controller des controllers) pouvait se trouver à la racine de l'app. Dorénavant, celui-ci se doit de se trouver avec les autres controllers dans le dossier consacré. Si ces exemples peuvent paraître anodins, ils ont permis une amélioration sensible des performances du framework puisque désormais certaines classes peuvent être chargées automatiquement. Ainsi, tous les dossiers contenant des classes sont
CamelCase pendant que ceux n'en contenant pas (webroot, config etc...) restent
lowcase, tout ça en vue d'implanter les
namespaces prochainement (chaque dossier représentant un niveau dans la hierarchie des
namespaces). Mais le chapitre performance va plus loin, puisque désormais quasiment tout utilise le
Lazy-Loading. La différence de performances entre les versions 1.3 et 2.0 est donc au final assez phénoménale, faisant de Cake 2 un framework bien plus rapide que son ancêtre. En moyenne, on observe une amélioration de l'ordre de minimum 50 % vis à vis des versions 1.3.
Un framework tourné vers l'avenir ?
Au delà de l'aspect performance, Cake 2.0 a voulu se tourner davantage vers l'avenir. Ainsi, certaines caractéristiques auparavant optionnelles deviennent désormais natives, par exemple l'utilisation de PDO ou de SPL. Dans le même registre, le support de
PostgreSql, SQLite ou encore
SqlServer a été largement amélioré, rendant leur utilisation bien moins buguée qu'auparavant et les mettant au même rang que MySQL quant à leur compatibilité.
Autre (très) bonne nouvelle est qu'il est désormais possible d'introduire ses propres objets pour qu'ils agissent comme des librairies de CakePHP (comme des
behaviors, des
helpers etc...), il devient ainsi bien plus simple de modifier le coeur de CakePHP rendant le core de celui-ci totalement customizable avec des éléments d'autres frameworks par exemple. Parmi d'autres ajouts et pour parler davantage aux connaisseurs du framework, on notera également la refonte du
RequestHandler (désormais
CakeRequest) afin de mieux gérer les requêtes HTTP ou la réécriture totale de l'
AuthComponent ou encore la création d'un objet statique CakeEmail permettant d'envoyer plus simplement des mails via CakePHP (sans passer par un composant)
Voyons par exemple l'édition d'un "post" sur un blog. Pour cela on va chercher à créer l'action
edit() dans le PostsController
Sous Cake 1.3
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?php
function edit($id = null) {
$this->Post->id = $id;
if (empty($this->data)) {
$this->data = $this->Post->read();
} else {
if ($this->Post->save($this->data)) {
$this->Session->setFlash('Your post has been updated.');
$this->redirect(array('action' => 'index'));
}
}
}
|
Sous Cake 2.0 (avec CakeRequest)
Code : PHP 1
2
3
4
5
6
7
8
9
10
11
12 | <?php
function edit($id = null) {
$this->Post->id = $id;
if ($this->request->is('get')) {
$this->request->data = $this->Post->read();
} else {
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash('Your post has been updated.');
$this->redirect(array('action' => 'index'));
}
}
}
|
La nouvelle classe
CakeRequest intègre les paramètres et fonctions liés aux requêtes entrantes. Embarquant ainsi plusieurs caractéristiques que l'on retrouvait dans le
RequestHandler ou le
Dispatcher. CakeRequest permet donc en gros de passer vos informations par un objet (Request en l'occurence) mais également, si vous le souhaitez, de détecter les conditions des requêtes :
Code : PHP | <?php
$this->request->is('post');
$this->request->isPost();
|
NDLR : Les 2 méthodes ont la même valeur.
Ainsi, si la variable est appelée en
post, Cake suppose que des variables ont été passées rendant par exemple inutiles certaines vérification avec
empty. Evidemment, il existe différent type tel que
is('get') (voir si la requête est un GET),
is('delete'),
is('mobile') (pour voir si la requête vient d'un terminal mobile) et bien d'autres dont vous trouverez la liste sur
la doc officielle.
Il est même possible grâce à l'API de CakeRequest, de créer vous même vos propres "
détecteurs". Pour cela, il suffit d'utiliser
CakeRequest::addDetector($name, $callback). Ainsi, imaginons que vous souhaitiez utiliser une action spéciale pour les utilisateurs d'iphone
Code : Cake1
| $this->request->addDetector('iphone', array('env' => 'HTTP_USER_AGENT', 'pattern' => '/iPhone/i')); |
Plusieurs options sont disponibles et je vous renvoie là aussi vers
la documentation officielle.

Mais l'une des plus grandes nouveautés est peut être ce plugin, amené à devenir (on l'espère) partie intégrante du
DataSource de CakePHP. Développé par Jose Lorenzo Rodriguez (développeur de la Core-Team)
MongoCake est un plugin, qui en plus d'intégrer
MongoDB à la solution, permet d'utiliser
Doctrine avec CakePHP et donc de renvoyer des objets et non plus de simples
arrays par les modèles. C'est peut être une des plus grosses nouveautés semi-officielles de cette sortie puisqu'elle corrigerait l'un des sujets préférés des détracteurs de Cake : son ORM. Si aujourd'hui le plugin reste à l'état de semi-officiel, pas intégré de base mais développé par la Core-Team, le fait que l'équipe de CakePHP communique dessus laisse présager à moyen-terme une intégration native de l'
ODM de Doctrine (+MongoDB) à CakePHP tout en laissant le choix de l'utiliser ou non. Position appréciable quand on sait que Doctrine est parfois un frein pour l'apprentissage de Sf, mais qu'il s'agit en même temps d'un formidable outil. En effet, à la manière de l'ORM de Doctrine, l'ODM permet la transparence persistante pour les objets en PHP 5.3+ sauf qu'à la place d'
EntityManager (avec l'ORM), vous utilisez le DocumentManager. Une manière ludique et transparente de passer à
NoSQL en utilisant Doctrine et CakePHP.
Conclusion
Avec cette nouvelle version CakePHP frappe un grand coup. Moins "magique", plus "logique", (bien) plus performante, cette mouture 2.0 de CakePHP est définitivement une réussite. On aurait aimé avoir un système de callback peut être mieux pensé et le fait que PHP 5.3+ ne soit pas supporté reste le (gros) point noir de cette version. Néanmoins, tout porte à croire que, très prochainement, le passage s'effectuera (probablement pour CakePHP 3 -
info soutirée à la Core-Team-) en attendant Cake 2 est une vraie avancée, messieurs (et mesdames) les zéros, à vos fourneaux !
Sources
29 Participations
Connectez-vous !
Connectez-vous !
Revenir à la liste des news
Lire aussi