2010-10-01 57 views
3

注入控制器属性我写了需要设置,因此目前正被指派的控制器上的属性插件。例如,如果我的插件是:Zend框架:如何从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'; 
    } 
} 

我希望能够做到这一点:

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

任何帮助,不胜感激!

回答

3

的动作控制器不能直接访问直接从前端控制器插件。实例化控制器对象的调度程序并不会将其保存在任何可访问的位置。

但是,控制器是任何注册动作助手访问。由于行动助手有一个preDispatch挂钩,你可以在那里做注射。

所以,在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'; 
    } 
} 

然后在application/Bootstrap.php注册助手的一个实例:

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

而且,一如既往,一定要包括My_configs/application.ini自动加载磁带机的命名空间:

autoloaderNamespaces[] = "My_" 

The N,在控制器中,直接访问该值作为一个公共成员变量:

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

有一点需要注意:由于辅助使用preDispatch()挂钩,我相信它会被要求每一个动作,甚至一个内部forward()

1

通过API浏览,我没有找到一个方法来直接到达控制器(我猜控制器存在之前,执行这个循环)。我能找到的东西几乎和访问一样容易,尽管语法有点不同。

通过请求参数

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); 
     } 
    } 
} 

而且在Zend_Controller_Action::xxxAction()$this->getParam('yourParam');


通过Zend_Controller_Action_Helper_Abstract

有一个在MWOP的博客中提到的另一种方式,但德es行动助手的形式,而不是:A Simple Resource Injector for ZF Action Controllers。他的例子让你访问任何变量Zend_Controller_Action$this->yourParam

+0

似乎对ZF动作控制器的*简单的资源喷油器*链接的内容被复制到@ DavidW的答案,但我强烈建议你阅读原始页面上的整个讨论。还有很多有用的评论。 – chelmertz 2010-10-02 09:24:37

+1

在发布此问题之前,我开始采用getParam()方法。我甚至认为“扩展一个基本控制器”的方式,但也发现在这里有许多不值得讨论的缺陷。使用动作助手似乎是做我想做的事情的正确方式,但在阅读了你提到的文章之后,我改变了主意,并将采用马修所描述的“注入依赖”方式。看起来与一群程序员一起工作最有效的方法。 – Julian 2010-10-03 18:55:49

+0

@ Julian我同意你的观点,但如果没有正确记录,可能很难找到所有这些依赖关系来自哪里。总而言之,这似乎是一个坚实的方法! – chelmertz 2010-10-03 21:52:07