2010-10-01 5 views
3

J'ai écrit un plugin qui doit définir une propriété sur le contrôleur actuellement distribué. Par exemple, si mon plug-in est:Zend Framework: Comment injecter une propriété de contrôleur à partir d'un Zend_Controller_Plugin

class Application_Plugin_Foo extends Zend_Controller_Plugin_Abstract 
{ 
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 
    { 
     // Get an instance of the current controller and inject the $foo property 
     // ???->foo = 'foo'; 
    } 
} 

Je veux être en mesure de le faire:

class IndexController extends Zend_Controller_Action 
{ 
    public function indexAction() 
     { 
      $this->view->foo = $this->foo; 
     } 
    } 
} 

Toute aide est grandement appréciée!

Répondre

3

Le contrôleur d'action n'est pas directement accessible directement à partir d'un plugin de contrôleur frontal. C'est le répartiteur qui instancie l'objet contrôleur et il ne semble pas l'enregistrer partout accessible. Cependant, le contrôleur est accessible à partir des aides à l'action enregistrées. Puisque les aides à l'action ont un crochet preDispatch, vous pouvez faire votre injection là-bas.

Ainsi, library/My/Controller/Helper/Inject.php:

class My_Controller_Helper_Inject extends Zend_Controller_Action_Helper_Abstract 
{ 
    public function preDispatch() 
    { 
     $controller = $this->getActionController(); 
     $controller->myParamName = 'My param value'; 
    } 
} 

Alors inscrivez-vous une instance de l'aide dans application/Bootstrap.php:

protected function _initControllerInject() 
{ 
    Zend_Controller_Action_HelperBroker::addHelper(
     new My_Controller_Helper_Inject() 
    ); 
} 

Et, comme toujours, assurez-vous d'inclure My_ comme un espace de noms autochargeur configs/application.ini:

autoloaderNamespaces[] = "My_" 

Le n, dans le contrôleur, accédez à la valeur directement en tant que variable membre public:

public function myAction() 
{ 
    var_dump($this->myParamName); 
} 

Une chose à noter: Étant donné que l'assistant utilise le crochet preDispatch(), je crois qu'il sera appelé à chaque action, même un forward() interne .

1

En parcourant l'API, je n'ai pas trouvé de moyen d'atteindre le contrôleur directement (je suppose que cette boucle est exécutée avant que le contrôleur existe). Ce que j'ai pu trouver est presque aussi facile d'accès, quoique avec une syntaxe un peu différente.

Via demande params

class Application_Plugin_Foo extends Zend_Controller_Plugin_Abstract 
{ 
    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) 
    { 
     $yourParam = 'your value'; 
     if($request->getParam('yourParam')) { 
      // decide if you want to overwrite it, the following assumes that you do not care 
      $request->setParam('yourParam', $yourParam); 
     } 
    } 
} 

Et dans un Zend_Controller_Action::xxxAction(): $this->getParam('yourParam');


Via Zend_Controller_Action_Helper_Abstract

Il y a une autre façon mentionné dans le blog de MWOP, mais il tak Soit la forme d'un assistant d'action à la place: A Simple Resource Injector for ZF Action Controllers. Son exemple vous permettrait d'accéder à n'importe quelle variable dans Zend_Controller_Action comme $this->yourParam.

+0

Il semble que le contenu du lien * Simple Resource Injector pour les contrôleurs d'action ZF * ait été copié dans la réponse de @ DavidW, mais je vous invite à lire l'ensemble de la discussion sur la page d'origine. Il y a aussi beaucoup de commentaires utiles. – chelmertz

+1

J'ai commencé à utiliser getParam() avant de poster cette question. J'ai même eu le "développement d'un contrôleur de base" aussi, mais j'ai trouvé que les deux défauts ne valaient pas la peine d'être discutés ici.Utiliser une aide à l'action semblait être la bonne façon de faire ce que je voulais faire, mais après avoir lu l'article que vous avez mentionné, j'ai changé d'avis et je vais utiliser les «dépendances à l'injection» décrites par Matthew. Semble la méthode la plus efficace pour travailler avec un groupe de programmeurs. – Julian

+0

@Julian Je suis d'accord avec vous mais si ce n'est pas documenté correctement, il peut être difficile de trouver d'où viennent toutes ces dépendances. Dans l'ensemble, cela semble être une méthode solide! – chelmertz