我使用控制器plugin predispatch()
函数实现了数据库驱动的ACL功能。
它工作正常。但它停止了在我的错误控制器上发送的请求。
例如,如果未定义指定的控制器/操作,则系统将显示消息"访问被拒绝",而不是显示"找不到请求/页面"。
所以我的问题如何使用predispatch()
方法在单个插件中实现 ACl 和错误处理。
请帮忙。
在控制器插件中,如有必要,重定向到错误控制器:
$request
->setModuleName('default')
->setControllerName('error')
->setActionName('access')
->setDispatched(true);
如果你想要一个特殊的页面,访问操作必须放入错误控制器中,或者你可以简单地使用现有的错误操作
您应该在数据库中设置错误控制器的权限。
因此,当前用户(角色 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');
首先插入资源表,然后插入权限表。
默认情况下,您应该为所有用户将错误控制器添加到 ACL 插件中。
if (!$this->has('Default_Error')) {
$this->addResource('Default_Error');
$this->allow('guest', 'Default_Error');
}
这样,每个人都可以看到错误控制器。