为无模型控制器实现授权策略时提示‘Resource class Administrator does not exist’,该如何解决?
无模型控制器实现授权策略时提示‘Resource class Administrator does not exist’,该如何解决?
嘿,我之前也碰到过一模一样的问题!咱们来拆解下问题到底出在哪,以及怎么解决:
首先你要明白,无模型控制器的授权逻辑和带模型的不一样——系统默认会尝试找对应名称的模型类,但你这里并没有Administrator模型,所以才会报“Resource class Administrator does not exist”的错。
问题出在这两处:
- 你在
Application.php里的MapResolver配置,用了'Administrator'作为键,但系统会把这个当成模型类去查找,自然找不到; - 控制器里的授权调用,传的
'Administrator'同样会被识别为模型资源,而非你的控制器。
具体修改步骤:
1. 调整Application.php中的授权解析器配置
把MapResolver的键改成控制器的完整类名,告诉系统这个控制器对应的Policy是哪一个:
public function getAuthorizationService(ServerRequestInterface $request): AuthorizationServiceInterface { $resolver = new ResolverCollection(); $resolver->add(new \Authorization\Policy\MapResolver([ // 用控制器的完整类名作为映射键 \App\Controller\AdministratorsController::class => \App\Policy\AdministratorPolicy::class, ])); $resolver->add(new \Authorization\Policy\OrmResolver()); return new AuthorizationService($resolver); }
2. 修改控制器里的授权调用
把授权的资源参数改成控制器实例本身(或者控制器的完整类名),这样系统就能匹配到你刚才配置的Policy:
public function import() { // 两种写法都可以,选你顺手的就行 $this->Authorization->authorize($this, 'import'); // 或者 // $this->Authorization->authorize(\App\Controller\AdministratorsController::class, 'import'); // 后面的业务逻辑... }
3. 可选:优化Policy方法的参数
因为是无模型控制器,canImport方法里的$resource参数其实用不上,你可以简化一下方法签名,让代码更清晰:
public function canImport(IdentityInterface $user) { return $user->is_admin; }
这样改完之后,系统就能正确找到对应的Policy类,不会再报错啦!
内容来源于stack exchange
相关产品推荐
相关产品推荐

