Php 中间件不起作用的Laravel策略

Php 中间件不起作用的Laravel策略,php,laravel,laravel-7,laravel-middleware,Php,Laravel,Laravel 7,Laravel Middleware,我正在拉维尔建立一个网站。我试图只允许创建模型的用户查看/修改模型。我注册了策略并在路由中使用中间件来限制查看/修改/删除/更新操作,但我总是未经授权 TrashPrivateReportPolicy: 类TrashPrivatePortPolicy { 使用免提授权; 之前的公共函数(用户$User){ 如果($user->can('manage_all_projects')){ 返回true; } } 公共功能结果(用户$User,垃圾桶私人报告$trash\u private\u报告){

我正在拉维尔建立一个网站。我试图只允许创建模型的用户查看/修改模型。我注册了策略并在路由中使用中间件来限制查看/修改/删除/更新操作,但我总是未经授权

TrashPrivateReportPolicy:


类TrashPrivatePortPolicy
{
使用免提授权;
之前的公共函数(用户$User){
如果($user->can('manage_all_projects')){
返回true;
}
}
公共功能结果(用户$User,垃圾桶私人报告$trash\u private\u报告){
返回$user->reports()->map(函数($report){$report->trash_report();})->包含($trash_private_report);
}
}
AuthServiceProvider

类AuthServiceProvider扩展了ServiceProvider { 受保护的$policies=[ //'App\Model'=>'App\Policies\ModelPolicy', “App\TrashPrivateReport”=>“App\Policys\TrashPrivateReportPolicy”, ]; 公共函数boot() { $this->registerPolicys(); Gate::before(函数($user,$ability){ 返回$user->abilities()->pull('name')->contains($ability); }); } } 路由:web.php

Route::get('/trash\u private\u reports/results/{trash\u private\u report}','TrashPrivateReportController@results')->name('trash_private_reports.results')->中间件('can:results,trash_private_report');
因此,当我作为lambda用户连接并希望查看页面结果时
“/trash\u private\u reports/results/id/”访问被禁止。 这项政策似乎没有被称为。我尝试了dd(…)的策略方法,但什么都没有发生

我已经试过了: 将策略数组更改为:

TrashPrivatePort::class=>TrashPrivatePortPolicy::class

更新和清除:

作曲家转储自动加载

php artisan路由:清除

php artisan视图:清除

php artisan配置:清除


谢谢您的帮助:)

中间件的第二个参数应该是模型

Route::get('/trash\u private\u reports/results/{trash\u private\u report}','TrashPrivateReportController@results')->name('trash_private_reports.results')->中间件('can:results,App\TrashPrivateReport');
编辑:

我通过将之前的替换为之后的解决了这个问题

Gate::after(函数($user$ability){
返回$user->abilities()->pull('name')->contains($ability);
});
这对我很有用:

Route::get('/', [UserController::class, 'index'])->middleware('can:viewAny,' . \App\Models\User::class)


我的模型是
App\models\User
。我在Laravel 8.33.1上进行了测试。

似乎不起作用。在这个例子中,使用了与我相同的语法:@Anaya如果你总是在
results
方法中返回
true
php公共函数结果(User$User,trashprivate\u report$trash\u private\u report){dd(“hello”);return true;}
什么都没有发生,dd未触发Edit似乎从未调用过策略,我认为它未正确注册或可能未与中间件一起正确使用
can
中间件的第二个参数是要使用的路由参数,如果没有模型实例与策略一起使用,您将使用类名控制器方法类型是否暗示模型允许路由模型绑定?
Route::get('/', [UserController::class, 'index'])->middleware('can:viewAny,App\Models\User')