novembre25
Ceux qui me connaissent le savent : je fait beaucoup de critiques sur le Zend Framework n’aimant pas vraiment les mauvaises habitudes de développement qu’il permet de prendre et les répétitions inutiles de code qu’il incite.
Je suis un fort partisan du DNRY (Do Not Repeat Yourself) et je ne m’en cache pas.
Cependant il est plus facile de vendre du Zend Framework qu’un autre framework que je ne nommerais pas mais qui a une équipe de développement non réactive et qui semble se reposer sur ses lauriers.
Alors je m’adapte et je tente de faire des trucs propres avec Zend Framework.
Et c’est faisable !!!
L’un des gros problèmes que je donnais au framework est le fait qu’il n’y a aucun chargeur automatique des modèles lorsque l’on utilise le framework en mode MVC. Il nous fallait donc faire quelque chose comme :
require_once APPLICATION_PATH . '/models/Users.php';
$this->Users = new Users();
Et ce dans chacun de nos contrôleurs qui utilise ce modèle. Pas cool.
Avoir quelque chose comme cela lors de la déclaration du contrôleur serait plus joli :
var $uses = array('Users');
Alors implémentons-le !
Tout d’abord, il nous faut déclarer ce que j’appelle un AppControlleur.
Il s’agit d’un contrôleur qui n’est jamais appellé seul. Il étends Zend_Controller_Action.
Chacun de nos contrôleurs étendra cet AppController. Ainsi, toute méthode présente dans celui-ci le sera dans le notre.
Donc, créons notre fichier dans le répertoire “application” de celle-ci. Nommons le AppController.php
Voici son contenu :
class AppController extends Zend_Controller_Action {
}
Puis il faut que nous inclusions notre AppController dans l’application. Dans bootstrap.php, après avoir défini la constante APPLICATION_PATH, placez :
include(APPLICATION_PATH . '/AppController.php');
Puis déclarez vos contrôleurs habituels de la manière suivante :
class MonController extends AppController
Voila, rechargez votre page. Si vous n’avez pas d’erreur, votre AppController est correctement chargé.
Super me direz-vous ! Mais ou ça m’amène ?
Eh bien maintenant, vous pouvez définir une méthode qui sera exécutée automatiquement à chaque chargement de page et qui chargera tous les modèles dont vous avez besoin.
Soyons fous, mettons à jour notre AppController :
class AppController extends Zend_Controller_Action {
function __construct($param, $param2) {
parent::__construct($param, $param2);
if (isset($this->uses))
foreach($this->uses as $model) {
if (file_exists(APPLICATION_PATH . '/models/'.$model.'.php'))
require_once APPLICATION_PATH . '/models/'.$model.'.php';
else
throw new Exception('Can\'t load model '.$model.' Please create the file \''.APPLICATION_PATH . '/models/'.$model.'.php\'');
if (class_exists($model))
$this->{$model} = new $model();
else
throw new Exception(APPLICATION_PATH . '/models/'.$model.'.php was supposed to declare class \''.$model.'\'');
}
}
}
Et voila ! Que faisons-nous ? Dans la méthode __construct, nous regardons si la variable de classe $uses est définie. Si c’est le cas, nous parcourons le tableau.
Pour chacun des éléments, nous vérifions si le modèle existe et nous le chargeons.
Puis nous vérifions si la class du bon nom existe et nous l’initialisons.
Et vous pouvez maintenant instancier tous les modèles de votre choix en une seule ligne de code dans chacun de vos contrôleurs.