Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour à tous !
je sais que dans chaque controller on peut faire ceci :
public function init() { $this->_redirector = $this->_helper->getHelper('Redirector'); $this->_redirector->setCode(301); }
Sauf que je me retrouve avec ce code qui se répète dans chacun de mes controllers.
Existe-t-il un moyen de factoriser ce code en le mettant dans le bootstrap (ou ailleurs) ?
Merci d'avance !
Hors ligne
Hello,
Tu étends le Zend_Controller_Action.
abstract class Extension_Controller_Action extends Zend_Controller_Action { public function init() { $this->_redirector = $this->_helper->getHelper('Redirector'); $this->_redirector->setCode(301); } }
Puis tes contrôleurs étendent Extension_Controller_Action, en appelant bien init() si eux-mêmes en ont besoin.
public function init() { parent::init(); // faire qqch }
A+
Hors ligne
2 interrogations :
- Tu es sûr que c'est Action que je dois étendre ? (j'aurais plutôt dit Controller, car le init() se fait dans le controller et non dans l'action)
- Pas d'autre moyen que d'étendre une classe ? Je me verrais contraint de modifier mon code dans plusieurs endroit et ça me gêne, je suis flemmard. De plus, je trouve un peu extrême d'étendre une classe si importante pour un simple code de redirection (ou alors donne moi d'autres exemples d'exploitation de cette extension... qui sait c'est peut-être une bonne chose)
En tout cas, merci pour ton aide
Hors ligne
Hello,
1. Ça j'en suis sûr ! Si tu veux étendre qqch, c'est Zend_Controller_Action (en plus Zend_Controller n'existe pas )
2. Dans mes applis, j'étends quasiment toutes les classes du ZF. Comme j'utilise le ZF depuis la version 0.6, les fonctionnalités actuelles n'étaient pas présentes à l'époque donc je devais beaucoup étendre. Maintenant avec l'arrivée des plugins ou autre fonctionnalités intégrées, c'est moins vrai.
Un exemple : j'initialise le cache dans mon bootstrap puis je le charge dans le Zend_Controller_Front par un setParam(), ensuite j'ai :
abstract class MP_Controller_Action extends Zend_Controller_Action { /** * Interface de gestion du cache * @var Zend_Cache_Frontend_Output */ public $cache; public function init () { $this->cache = Zend_Controller_Front::getInstance()->getParam('cache'); } }
A+
Hors ligne
1. Oooops désolé, je parle trop vite :S
Mais si je refais un init dans mes controllers, je ne risque pas d'écraser le init() de la classe abstraite ? (a moins de faire parent::init() ... c'est valide ?)
2. Tiens mais justement, ça n'est pas possible de passer par le Zend_Controller_Front pour initialiser le code de redirection ?
Hors ligne
Hello,
J'avais prévu ta question, j'aurais du l'anticiper . Mon code complet :
abstract class MP_Controller_Action extends Zend_Controller_Action { /** * Interface de gestion du cache * @var Zend_Cache_Frontend_Output */ public $cache; final public function init () { $this->cache = Zend_Controller_Front::getInstance()->getParam('cache'); $this->setUp(); } public function setUp() {} }
Notes le FINAL qui empêche les contrôleurs d'appeler init(), il doivent appeler setUp().
Redirector est une helper d'action, tu ne peux l'atteindre que dans un Zend_Controller_Action et il ne possède pas de méthode statique permettant de faire le réglage une bonne fois pour toutes dans le bootstrap.
L'autre possibilité, c'est d'étendre Zend_Controller_Action_Helper_Redirector :
class Extension_Controller_Action_Helper_Redirector extends Zend_Controller_Action_Helper_Redirector { protected $_code = 301; }
Puis de t'assurer que ce helper est chargé en premier dans la pile (c-à-d avant Zend_Controller_Action_Helper_Redirector)
A+
Hors ligne
J'aime mieux cette derniere solution, car si je suis ton raisonnement, cela sera transparent pour les controllers (ils utilisent l'instance de redirector qu'ils trouvent, je suppose).
Et le fait de charger mon extension de redirector avant le "vrai" suffit pour empêcher le "vrai" de se charger ? C'est une sorte de getInstance() ?
Toujours dans cette optique, où dois-je faire la modification pour charger mon helper en premier ? Je connais mal les tripes de ZF, encore trop noob...
EDIT : je tilte... et pourquoi ne pas le modifier directement dans le code de Zend_Controller_Action_Helper_Redirector ?
Au moins je serais tranquille....
Dernière modification par Bast (14-05-2008 12:10:11)
Hors ligne
Hello,
Il n'est jamais bon de modifier directement le ZF car quand tu feras une évolution de version, tu oublieras ta modif.
Pour charger les helpers, il faut faire un addHelperPath() sur ton objet de vue. Il m'est difficile de te montrer un bout de code car il y a beaucoup de paramètres à prendre en compte.
A+
Hors ligne
Ok je ferai des recherches sur addHelperPath().
Merci pour ton aide !
Hors ligne
Pages: 1