1

我试图想办法在预调度期间调用插件,但我在最后调用它时遇到了麻烦。

基本上我需要在所有控制器预调度之后调用它,然后再调用 action 方法。

这可能吗?

我最后尝试通过传递一个高值来调用插件,但我知道这是错误的。我不想在 postDispatch 上调用它。

 $front->registerPlugin(new Plugin_Acl, 1000);

 class Plugin_Acl extends Zend_Controller_Plugin_Abstract
 {
     public function preDispatch(...)
     {
       // ... DO STUFF before any action method
     }
  }
4

3 回答 3

1

该标准Zend_Controller_Action有一个 preDispatch()方法,该方法preDispatch()在所有前端控制器插件(甚至在控制器实例化之前发生)上调用,然后在所有附加的动作助手上调用,就在动作方法本身之前。请参阅Zend_Controller_FrontZend_Controller_Dispatcher_StandardZend_Controller_Actiondispatch()上的方法以了解流程。

因此,如果您想在所有控制器上运行某些东西,那么您可以创建一个基本控制器,其中preDispatch()包含您要运行的代码的方法。

于 2012-06-22T07:23:07.400 回答
0

我在 dispatchLoopStartup() 中这样做

class My_Plugins_Front extends Zend_Controller_Plugin_Abstract {

    public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request){

        // Register ACL plugin if is admin controller (for eg.)
        if($request->getControllerName() == 'admin'){
            /**
             * Set up your ACL
             */
        }

        // You can setting variable to see in all view files
        $layout     = Zend_Layout::getMvcInstance();
        $view       = $layout->getView();
        $view->test = 'test';
    }

    public function dispatchLoopShutdown(){}
}
于 2012-06-22T09:29:45.307 回答
0

调用 predispatch 似乎对我的 acl 有用:

class Controller_Plugin_Acl extends Zend_Controller_Plugin_Abstract
{

    public function preDispatch(Zend_Controller_Request_Abstract $request) {
        parent::preDispatch($request);
        //do some stuff
}

然后它在 application.ini 中使用以下行实例化:

resources.frontController.plugins.acl = "Controller_Plugin_Acl"

希望这可以帮助一些...

于 2012-06-22T09:46:22.500 回答