Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 13-05-2008 17:27:56

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

[1.5.1] Initialiser le code de redirection dans le bootstrap ?

Bonjour à tous !
je sais que dans chaque controller on peut faire ceci :

Code:

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

 

#2 13-05-2008 18:20:51

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [1.5.1] Initialiser le code de redirection dans le bootstrap ?

Hello,

Tu étends le Zend_Controller_Action.

Code:

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.

Code:

public function init()
{
    parent::init();
    // faire qqch
}

A+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#3 14-05-2008 10:24:10

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [1.5.1] Initialiser le code de redirection dans le bootstrap ?

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 sad (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 smile

Hors ligne

 

#4 14-05-2008 11:02:20

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [1.5.1] Initialiser le code de redirection dans le bootstrap ?

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 wink)

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 :

Code:

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+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#5 14-05-2008 11:10:23

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [1.5.1] Initialiser le code de redirection dans le bootstrap ?

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

 

#6 14-05-2008 11:22:07

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [1.5.1] Initialiser le code de redirection dans le bootstrap ?

Hello,

J'avais prévu ta question, j'aurais du l'anticiper smile. Mon code complet :

Code:

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 :

Code:

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+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#7 14-05-2008 12:06:14

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [1.5.1] Initialiser le code de redirection dans le bootstrap ?

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

 

#8 14-05-2008 12:26:06

mikaelkael
Administrateur
Lieu: Donges
Date d'inscription: 18-06-2007
Messages: 1176
Site web

Re: [1.5.1] Initialiser le code de redirection dans le bootstrap ?

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+


Less code = less bugs
Contributeur ZF - ZCE - ZFCE - Doc ZF (CHM & PDF) - Vice-trésorier AFUP 2011
Ubuntu 11.04 - ZendServer

Hors ligne

 

#9 14-05-2008 12:38:22

Bast
Membre
Date d'inscription: 07-06-2007
Messages: 138

Re: [1.5.1] Initialiser le code de redirection dans le bootstrap ?

Ok je ferai des recherches sur addHelperPath().
Merci pour ton aide !

Hors ligne

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages