Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 28-08-2007 18:30:13

nohrad
Membre
Lieu: Lyon
Date d'inscription: 25-08-2007
Messages: 11

[Résolu][Zend_Controller][1.0.1] Init dans un controller d'action

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

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.

Code:

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  cool

Dernière modification par nohrad (28-08-2007 19:22:36)

Hors ligne

 

#2 28-08-2007 18:45:23

rod
Administrateur
Lieu: Tours
Date d'inscription: 01-03-2007
Messages: 97
Site web

Re: [Résolu][Zend_Controller][1.0.1] Init dans un controller d'action

Personnellement j'ai créé mon propre controller action pour faire mes initialisations.

Code:

<?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

Code:

<?php

class IndexController extends NET2COM_Controller_Action
{
    public function indexAction()
    {
        $this->_db->query("EXECUTER UNE REQUETE");
    }
}

?>

Hors ligne

 

#3 28-08-2007 18:49:03

sekaijin
Membre
Date d'inscription: 17-08-2007
Messages: 1137

Re: [Résolu][Zend_Controller][1.0.1] Init dans un controller d'action

tu ecrit une classe Action que tu place dans le dossier des contrôleurs.

Code:

<?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 :

Code:

<?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

Code:

   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

Code:

   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

 

#4 28-08-2007 19:00:55

rod
Administrateur
Lieu: Tours
Date d'inscription: 01-03-2007
Messages: 97
Site web

Re: [Résolu][Zend_Controller][1.0.1] Init dans un controller d'action

Une petite précision quand à l'utilisation de :

Code:

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 :

Code:

require_once 'Zend/Controller/Action.php';

Hors ligne

 

#5 28-08-2007 19:23:38

nohrad
Membre
Lieu: Lyon
Date d'inscription: 25-08-2007
Messages: 11

Re: [Résolu][Zend_Controller][1.0.1] Init dans un controller d'action

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

Hors ligne

 

#6 29-08-2007 08:55:03

philippe
Administrateur
Lieu: Grenoble
Date d'inscription: 01-03-2007
Messages: 1624

Re: [Résolu][Zend_Controller][1.0.1] Init dans un controller d'action

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 :

Code:

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)

Code:

$simpleHelper = new Kitpages_SimpleHelper();
$simpleHelper->setDb($db);
Zend_Controller_Action_HelperBroker::addHelper($simpleHelper);

A+, Philippe


twitter : @plv ; kitpages.fr : Création de sites internet à Grenoble et Paris

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