You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为无模型控制器实现授权策略时提示‘Resource class Administrator does not exist’,该如何解决?

无模型控制器实现授权策略时提示‘Resource class Administrator does not exist’,该如何解决?

嘿,我之前也碰到过一模一样的问题!咱们来拆解下问题到底出在哪,以及怎么解决:

首先你要明白,无模型控制器的授权逻辑和带模型的不一样——系统默认会尝试找对应名称的模型类,但你这里并没有Administrator模型,所以才会报“Resource class Administrator does not exist”的错。

问题出在这两处:

  1. 你在Application.php里的MapResolver配置,用了'Administrator'作为键,但系统会把这个当成模型类去查找,自然找不到;
  2. 控制器里的授权调用,传的'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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 13:29:34