Zend framework Zend控制器插件与子类化动作控制器

Zend framework Zend控制器插件与子类化动作控制器,zend-framework,Zend Framework,我的应用程序中有一个相当标准的ACL系统。有一个登录控制器和一堆其他控制器重定向回登录,如果用户未经授权。我使用一个控制器插件来检查ID和重定向,我显然不希望登录控制器和错误控制器执行这样的重定向 现在我已经读了好几遍,使用控制器插件比子类化动作控制器更好。然而,我看到的是,从这个抽象的基本控制器类扩展我的所有控制器要容易得多,它在init方法中执行必要的检查,除了直接扩展Zend_controller_操作的Login控制器 所以问题是,有没有一种方法可以选择性地将插件附加到控制器上?当然,我

我的应用程序中有一个相当标准的ACL系统。有一个登录控制器和一堆其他控制器重定向回登录,如果用户未经授权。我使用一个控制器插件来检查ID和重定向,我显然不希望登录控制器和错误控制器执行这样的重定向

现在我已经读了好几遍,使用控制器插件比子类化动作控制器更好。然而,我看到的是,从这个抽象的基本控制器类扩展我的所有控制器要容易得多,它在init方法中执行必要的检查,除了直接扩展Zend_controller_操作的Login控制器

所以问题是,有没有一种方法可以选择性地将插件附加到控制器上?当然,我总是可以用某些控制器制作一个数组,通过setter方法将其发送到插件,然后执行如下操作:

$controller = $request->getParam('controller');

if (count($this->exceptions))
    if (in_array($controller, $this->exceptions)) return;

//...check ID, perform redirect, etc...
但有些事情告诉我这不是最好的方式

还有建议

编辑1:@Billy ONeal

谢谢你的答复,但我不太明白。我能行

public function init()
{
    $this->getRequest()->setParam('dropProtection', true);
}
(或者在我的登录控制器中运行一些设置插件的私有变量的方法),然后说如果“dropProtection”不是真的,那么检查用户ID。但实际的调度过程如下所示:

Plugin::dispatchLoopStartup
Plugin::preDispatch
Controller::init
Plugin::postDispatch
Plugin::preDispatch
Plugin::postDispatch
Plugin::dispatchLoopShutdown
所以我不能在Plugin::postDispatch之前检查这个'dropProtection'参数,这有点晚了。(顺便问一下,为什么preDispatch和postDispatch会被调用两次?)

有没有办法选择性地将插件连接到控制器

当然。如果请求不包含您要查找的参数,就不要注册插件。或者,假设所有页面都受到保护,并且让那些不应该受到保护的页面在
init
阶段调用插件上的某些方法

如果你只想保护一个控制器,你可以反过来——只有在初始化阶段调用了某个方法时,插件才会采取行动

最后,您可以将页面的整个登录部分设置为自己的模块,这将允许您在检查凭据和重定向之前检查该模块的插件

有没有办法选择性地将插件连接到控制器

当然。如果请求不包含您要查找的参数,就不要注册插件。或者,假设所有页面都受到保护,并且让那些不应该受到保护的页面在
init
阶段调用插件上的某些方法

如果你只想保护一个控制器,你可以反过来——只有在初始化阶段调用了某个方法时,插件才会采取行动


最后,您可以将页面的整个登录部分设置为自己的模块,这将允许您在检查凭据和重定向之前检查该模块的插件。

如果您想更早地执行此操作,我认为您可以使用第一种方法(向插件传递一系列异常)并在routeShutdown中测试模块名或控制器名

Personnaly我使用动作助手检查所有动作中的身份验证。它更灵活,给我更多的控制。每个私人行动只有一行


并且不要将你的动作控制器子类化。我在我的一个项目上做的,现在我的基类是一堆狗屎。请改用action helper。

如果您想更早地执行此操作,我认为您可以使用第一种方法(向插件传递一组异常),并在routeShutdown中测试模块名或控制器名

Personnaly我使用动作助手检查所有动作中的身份验证。它更灵活,给我更多的控制。每个私人行动只有一行

并且不要将你的动作控制器子类化。我在我的一个项目上做的,现在我的基类是一堆狗屎。改用action helper。

你能澄清“我的基类是POS”吗?你能澄清“我的基类是POS”吗?