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
相关产品推荐
相关产品推荐

