1

我已经使用控制器功能实现了数据库驱动的 ACLplugin predispatch()功能。

它工作正常。但它停止了在我的错误控制器上发送的请求。

例如,如果未定义指定的控制器/操作,则系统将显示消息“拒绝访问”而不是显示“未找到请求/页面”。

所以我的问题是如何在单个插件中使用predispatch()方法实现 ACl 和错误处理。

请提供任何帮助。

4

3 回答 3

1

在您的控制器插件中,如有必要,重定向到错误控制器:

$request
  ->setModuleName('default')
  ->setControllerName('error')
  ->setActionName('access')
  ->setDispatched(true);

如果您想要一个特殊页面,则必须将 accessAction 放入错误控制器中,或者您可以简单地使用现有的 errorAction

于 2012-10-03T13:10:48.303 回答
1

您应该在数据库中设置错误控制器的权限。

所以当前用户(角色 ID)应该有权访问错误控制器。

我不知道您是数据库表的结构,但以我的方式(可能是相似的):

INSERT INTO "resources" ("id","name","description") VALUES (11,'error', 'Error controller');
INSERT INTO "permissions" ("role_id", "resource_id", "is_allowed") VALUES (1, 11, 't');

先插入资源表,再插入权限表。

于 2012-10-03T13:34:07.973 回答
0

默认情况下,您应该为所有用户将错误控制器添加到 ACL 插件中。

if (!$this->has('Default_Error')) {
    $this->addResource('Default_Error');
    $this->allow('guest', 'Default_Error');
}

这样每个人都可以看到错误控制器。

于 2013-12-11T08:42:27.493 回答