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

Laravel 6.0路由中间件传递多参数:Policy未触发如何解决?

嘿,我来帮你搞定这个Laravel 6里路由中间件传递多参数到Policy的问题~

首先得明确你之前两种写法的问题所在:

  • 第一种写法里,你把模型类名MyFirstModel、MySecondModel直接传给了can中间件,但这里需要的是路由参数的名称,而不是类名,Laravel没法正确解析成路由里的模型实例,自然不会调用你的Policy方法。
  • 第二种用|分隔参数的方式,Laravel并不识别这种格式,所以也无法传递参数到Policy。

正确的写法步骤:

1. 修正路由的中间件参数

把路由里的can中间件改成用路由参数名传递,并且用逗号分隔多个参数:

Route::get('view/{myFirstModel}/{mySecondModel}', 'MyController@view')
    ->middleware(['can:view,myFirstModel,mySecondModel']);

这里要注意:路由参数名({myFirstModel})和中间件里写的参数名要完全一致,大小写也要对应(建议统一用小写蛇形或驼峰,保持一致就行)。

2. 确保Policy方法参数顺序正确

你的Policy方法其实参数顺序是对的,但再确认下:第一个参数必须是User实例,然后依次是路由参数对应的模型实例,顺序要和路由里的参数顺序一致:

use App\User;
use App\MyFirstModel;
use App\MySecondModel;

public function view(User $user, MyFirstModel $first, MySecondModel $second) {
    // 这里可以用dd()测试是否能拿到实例
    dd($user, $first, $second);
}

3. 确认Policy已正确注册

在App\Providers\AuthServiceProvider里,要把这个Policy和对应的模型绑定(通常绑定到第一个模型即可,因为Laravel会以第一个模型来匹配Policy):

protected $policies = [
    MyFirstModel::class => MyPolicy::class, // 替换成你实际的Policy类名
];

这样调整之后,当你访问这个路由时,Laravel会自动把路由里的myFirstModel和mySecondModel解析成对应的模型实例,然后传递到Policy的view方法里,你就能看到测试的输出啦。

内容的提问来源于stack exchange,提问作者LorenzoBerti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:29:52