Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour @ tous,
Je m'initie petit à petit au Zend Framework et j'essaye de trouver des solutions dans la doc ou les tutoriaux mais sur ce coup là je bloque !
J'ai plusieurs contrôleur et dans chaque contrôleur je fais appel à la fonction init() pour effectuer quelques "réglages". Seulement certains réglages sont récurents, comme par exemple fixer la valeur de la variable $db.
protected $_db; public function init() { $this->_db = Zend_Registry::get('db'); // autres traitements récurents }
J'aimerais savoir où je peux placer ce traitement récurrent pour ne pas avoir à le répéter dans chaque phase d'initalisation de mes controleurs.
Les solutions que j'ai envisagées :
1. Etendre la classe Zend_Controller_Action et créer une fonction init() qui fait tout les réglages , et dans la classe enfant faire parent::init().
Mais cela oblige quand même à avoir un bout de code à ajouter à tous les contrôleur
2. Faire un plugin. Mais je n'ai pas trouvé comme attribuer une valeur au contrôleur et je ne sais pas où placer mon code (preDispatch ???)
3. Faire un helper. Là je suis totalement perdu !!!
En espérant que quelqu'un pourra me donner un petit coup de main. D'avance merci
Dernière modification par nohrad (28-08-2007 19:22:36)
Hors ligne
Personnellement j'ai créé mon propre controller action pour faire mes initialisations.
<?php require_once 'Zend/Controller/Action.php'; class NET2COM_Controller_Action extends Zend_Controller_Action { protected $_db = null; public function init() { parent::init(); if (Zend_Registry::isRegistered('db')) { $this->_db = Zend_Registry::get('db'); } } } ?>
Et ensuite tous mes controlleurs hérite de cette classe et non celle de Zend
<?php class IndexController extends NET2COM_Controller_Action { public function indexAction() { $this->_db->query("EXECUTER UNE REQUETE"); } } ?>
Hors ligne
tu ecrit une classe Action que tu place dans le dossier des contrôleurs.
<?php Zend_Loader::loadClass("Zend_Controller_Action"); class Action extends Zend_Controller_Action { public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array()) { parent::__construct($request, $response, $invokeArgs); } public function init() { parent::init(); //tout les inits de toutes tes actions ici } }
que tu enregistre dans le fichier Action.php
tu modifie tes contrôleurs d'action de la façon suivante :
<?php require dirname(__FILE__).'/Action.php'; /** * Contrôleur par défaut de l'application * * @author your name * */ class IndexController extends Action { ...
tes contrôleurs exécuteront tous la méthode init et seront tous initialisé par la même méthode.
si dans un contrôleur d'action tu as une init différente tu mets la méthode ini comme suit
public function init() { parent::init(); //tout les inits de ton action ici }
ainsi ton contrôleur auras le sinit commune + les siennes propre.
si par contre tu as un contrôleur qui ne dois pas avoir les même init il te suffit de lui mettre une méthode init comme suite
public function init() { //tout les inits de ton action ici }
dans ce cas la méthode init de la classe Action ne sera pas exécutée.
enfin si le nom de la classe action te pose pb tu peux l'appeler application_controlleurs_Action
et dans tes contrôleur à la place du require tu peux faire un Zend_Loader::loadClass("application_controllers_Action");
A+JYT
Hors ligne
Une petite précision quand à l'utilisation de :
Zend_Loader::loadClass('Zend_Controller_Action');
Il est recommendé d'utiliser cette méthode uniquement lorsque l'on ne sait pas au moment de l'execution le nom de la classe à inclure.
Si on connait le nom de celle-ci il faut mieux utiliser :
require_once 'Zend/Controller/Action.php';
Hors ligne
Merci pour l'explication. C'est bien ce que je voulais faire, mais je m'étais un peu emmêler les pinceaux !
Tout marche nickel maintenant !!!
Hors ligne
Bonjour nohrad,
Il y a une autre solution, c'est de créer un helper qui injecte $db dans ton controller. Quelque chose du genre :
class Kitpages_SimpleHelper extends Zend_Controller_Action_Helper_Abstract { private $_db= null; public function setDb($db) { $this->_db = $db; } public function init() { $this->getActionController()->db = $this->_db; } }
Et tu enregistres ton helper dans le bootstrap (index.php)
$simpleHelper = new Kitpages_SimpleHelper(); $simpleHelper->setDb($db); Zend_Controller_Action_HelperBroker::addHelper($simpleHelper);
A+, Philippe
Hors ligne
Pages: 1