Tag cloud
xhtml migration routes css twitter behavior ASP.NET framework stage filezilla scrum lithium MySQL communauté outils astuce wordpress référencement débogage pense-bête java motivation pierre martin mvc productivité php blog cakefest open source Méthode conception conférences loi jsf ie6 logiciel développement web CakePHP web
-
k3mo
-
Pierre Martin
-
avairet


Importer un modèle depuis un contrôleur
La question revient souvent sur le forum ou sur IRC, alors voici un petit récapitulatif pour comprendre comment importer proprement un modèle au sein d’un contrôleur CakePHP lorsque l’on en a besoin. Le cas d’utilisation le plus typique est la mise en place d’un tableau de bord qui centralise des informations de divers Modèles de l’application.
Vous avez sans doute entendu parler de l’attribut Controller::$uses, de ClassRegistry::init(), de Controller::loadModel() ou de App::import() … mais que fait chacune de ces méthodes et laquelle choisir ?
Cet article reprend les conseils déjà rabachés à divers endroits en langue anglaise, et également les explications de gwoo sur le Google group anglais… en essayant de détailler un peu. Voici donc par ordre de préférence les méthodes à utiliser.
Cake a déjà tout fait !
Et oui, dans la plupart des cas vous n’aurez rien à faire ! Il suffit simplement que vos modèles soient reliés entre eux pour « suivre le chaînage » et arriver au contrôleur visé.
Admettons par exemple qu’un Gateau ait plusieurs Ingredients ayant chacun des Magasins où ont peut les acheter (on ne se moque pas de l’exemple
). Depuis le contrôleur Gateau, nous souhaitons récupérer les derniers Magasins ajoutés… il nous suffira de faire :
Rien de plus simple ! Ce cas est normalement le plus répandu au sein de votre application.
Controller::loadModel()
Si ponctuellement vous souhaitez utiliser un modèle qui n’est pas lié à votre modèle actuel (sinon, il faut utiliser ce qui vient d’être présenté), la meilleure solution est d’utiliser la méthode loadModel() de votre contrôleur.
Lors de l’appel à loadModel(), CakePHP va regarder si le modèle est persistant (Controller::persistModel == true) et le charger soit du cache soit en instanciant sa classe. Cette méthode est un wrapper de ClassRegistry::init() que nous verrons ensuite.
Revenons à notre exemple : vous êtes dans votre contrôleur « dashboard » qui a une seule action permettant de récupérer et d’afficher diverses statistiques de votre site. Parmi ces informations se trouve la liste des derniers magasins ajoutés (quel heureux hasard !) … voici comment la récupérer :
Il n’y a pas plus simple et plus propre d’utilisation ! L’intérêt de cette méthode contrairement au « $uses » c’est que le modèle est chargé uniquement au moment où vous en avez besoin.
L’attribut $uses
Cet attribut est sans doute un attribut que vous avez l’habitude de manipuler, mais mieux vaut en fait s’en servir le moins possible. En effet, comme le dit la documentation les modèles mentionnés dans l’attribut « $uses » de votre contrôleur seront chargés à chaque appel d’une action de ce contrôleur.
Bien que celà ne soit pas optimal si vous n’utilisez un modèle que dans une seule action, celà pourra vous servir si le modèle est utilisé au sein de toutes vos actions. Le code est assez simple et connu, je ne vous ferai pas l’affront de la remettre ici (un tableau avec le nom des modèles à charger
)
ClassRegistry::init() – moins conseillé
Cette méthode va créer une instance du Modèle demandé, et la retourner. C’est cette méthode qui est appelée depuis Controller::loadModel(), sauf que cette dernière se charge également de gérer la persistance des modèles chargés. Ainsi vous n’avez pas spécialement de raison d’utiliser ClassRegistry::init() depuis un contrôleur !
Voici néanmoins le code qui va bien :
App::import() – pas trop utile
La méthode App::import() quand à elle ne fait qu’une seule chose : elle inclue le fichier contenant la classe passée en paramètre. En fait elle permet d’inclure n’importe quel type de classe (Composant, Comportement …).
Il vous faudra en revanche instancier la classe par la suite :
Cette solution est en pratique jamais utilisée pour charger un modèle depuis un contrôleur
Conclusion
Voici un rapide récapitulatif des méthodes permettant de rendre un modèle accessible depuis un contrôleur avec CakePHP … rien de très compliqué comme vous l’avez vu, mais celà peut servir de pense-bête !
N’hésitez pas à commenter l’article si vous avez des remarques ou si certaines situations se prêtent plus à une solution qu’à une autre (et que j’ai dit des bêtises !)