Zend Framework:如何从Zend_Controller_Plugin注入控制器属性

时间:2010-10-01 15:45:20

标签: zend-framework plugins

我写了一个插件,需要在当前正在调度的控制器上设置属性。例如,如果我的插件是:

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

非常感谢任何帮助!

2 个答案:

答案 0 :(得分: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_"

然后,在控制器中,直接将值作为公共成员变量访问:

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

有一点需要注意:由于帮助程序使用preDispatch()挂钩,我相信它会在每个操作上被调用,甚至是内部forward()

答案 1 :(得分: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的博客中提到了另一种方式,但它采取的是动作助手的形式:A Simple Resource Injector for ZF Action Controllers。他的示例允许您访问Zend_Controller_Action$this->yourParam的任何变量。