我写了一个插件,需要在当前正在调度的控制器上设置属性。例如,如果我的插件是:
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;
}
}
}
非常感谢任何帮助!
答案 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
的任何变量。