Voici aujourd’hui un rapide zoom sur une méthode de CakePHP qui permet de facilement récupérer les différents types de fichiers d’une application (helpers, modèles, contrôleurs ou encore plugins). Cette méthode existe depuis un bon moment et était accessible par Configure::listObjects(). Dans la version 1.3 de CakePHP celle-ci a été améliorée et renommée en App::objects().
Je vous invite à lire la documentation pour comprendre comment utiliser cette méthode, le but de cet article étant avant tout de proposer une utilisation concrète résolvant une de ses limites. En effet, seuls les objets de l’application sont retournés par l’application ce qui peut poser problème si on veut par exemple récupérer tous les modèles de l’application ET de ces plugins.
Cet article illustre la récupération des Modèles d’une application, mais il est évident que cette technique peut être facilement généralisée ou modifiée pour tout autre type d’objet (helpers, contrôleurs …).
CakePHP permet donc de récupérer de maniere simple tous les objets d’un certain type en faisant par exemple App::objects(‘model’);
Par contre cette méthode ne renvoie pas la liste des objets inclus dans les plugins. Prenons l’exemple d’une application ayant un modèle Article, et un plugin « comments » contenant le modèle Comment. L’instruction ci-dessus ne retournera que le modèle Article.
J’ai récemment souhaité effectuer un traitement sur tous les modèles d’une application ayant un certain Comportement (par exemple : $actsAs = array(‘Commentable’); ). Le filtrage des modèles n’est pas très compliqué (un appel à array_filter avec une méthode simple de callback), en revanche il fallait trouver une solution pour lister tous les modèles de l’application. Voici donc le petit bout de code qui fait le travail à votre place :
/** * Returns a list of all application models (including plugins) * * @return array List of models */ private function __getModels() { $models = App::objects('model'); $plugins = App::objects('plugin'); if (!empty($plugins)) { foreach ($plugins as $plugin) { $pluginModels = App::objects('model', App::pluginPath($plugin) . 'models' . DS, false); if (!empty($pluginModels)) { foreach ($pluginModels as $model) { $models[] = "$plugin.$model"; } } } } return $models; }
Remarques sur le code :
- par défaut CakePHP met en cache les résultats des appels à App::objects c’est pour cette raison que l’appel effectué dans le foreach désactive le cache en passant false comme dernier argument.
- notez que nous nommons les modèles contenus dans les plugins de la forme Plugin.Modele, cela permet d’identifier chaque modèle de manière unique et permet de les charger facilement par la suite en utilisant ClassRegistry::init().
En espérant que vous trouverez de l’utilité à cette technique un jour ou l’autre … en attendant si vous avez des questions, n’hésitez pas !

Pingback: List all the models and plugins of a cakephp Application | Variable 3 Technologies