Laravel动态获取模型时Policy未触发调用的问题求助
我最近碰到了一个Laravel Policy的诡异问题:手动查询获取模型后,调用Gate::authorize()时,对应的Policy方法完全没被触发——既不报错,也不拒绝,就像这段代码根本不存在一样。
具体场景是这样的:在我的控制器方法里,我从请求体的link_code参数查询对应的ConnectionCode模型,代码如下:
public function validate(Request $request) { $request->validate([ 'link_code' => 'required|string', ]); $data = json_decode($request->getContent(), true); /** @var \App\Models\ConnectionCode|null $code */ $code = \App\Models\ConnectionCode::where('code', $data['link_code'])->first(); // 我也试过用firstOrFail()替代first(),结果还是一样 // $code = \App\Models\ConnectionCode::where('code', $data['link_code'])->firstOrFail(); Gate::authorize('validateConnection', $code); // 后续逻辑... }
对应的validateConnection() Policy方法是存在的,而且在路由模型绑定注入模型的控制器方法里完全正常工作:
public function validateConnection(User $user, ConnectionCode $code): bool { return $code->device->user_id === $user->id; }
我已经确认Policy在AuthServiceProvider里正确注册了,其他针对ConnectionCode的Policy方法在路由绑定模型的场景下也都没问题。一开始我怀疑是Laravel没法自动识别手动获取的模型类,所以特意dump了Gate::getPolicyFor($code),结果它确实返回了正确的App\Policies\ConnectionCodePolicy——说明Laravel能找到对应的Policy类,但就是死活不调用validateConnection()方法。
有没有人遇到过类似的情况?如果模型不是通过路由绑定注入的,有没有办法明确告诉Laravel该调用哪个Policy方法?
补充排查说明:
我之前还反复确认过AuthServiceProvider里的Policy注册是正确的,其他路由绑定模型的场景下Policy都正常工作。现在既然已经确认Policy能被正确获取,那问题应该不在注册上,会不会是Laravel在这种场景下对权限方法名或者模型类型的判断逻辑有什么特殊处理?现在卡在这里完全没头绪...
内容来源于stack exchange

