我正在使用Laravel 5.1,更具体地说是Authorization包。
在此软件包之前,我将使用FormRequest::authorize()
方法执行所有授权检查,因为此方法专门用于授权检查。
我现在想在laravel中使用本机Authorization包,其中包括Policy文件,但我想在请求文件中使用它们。
这意味着,据我所知,每个表单请求文件都需要映射到策略文件。
当然这不可能是对的吗?如果我在每个控制器中有7个主要方法,则7个映射到单个策略文件,每个请求文件1个。如果我有20个控制器,那就是140个映射!
我知道我可以在控制器中执行auth检查,只是映射控制器,但这似乎代表Laravels的实现很差,否则为什么要将authorize()
方法放在请求中?
问题
在一个理想的世界中,我希望在到达控制器之前进行策略验证检查 - 在请求中执行此操作。但我不想将每个请求文件映射到策略中。
有没有办法从请求中检索目标控制器,这样我就可以有一个映射 - controller - >策略,并从请求中引用控制器?
答案 0 :(得分:3)
实际上,我发现了一种非常简单的方法,并且感觉有点愚蠢,我没有早点尝试过!
在我的AuthServiceProvider
文件中,我已将每个请求都映射到策略文件,如下所示:
protected $policies = [
\App\Http\Requests\Servers\Index::class => Policies\ServerPolicy::class,
\App\Http\Requests\Servers\Create::class => Policies\ServerPolicy::class,
\App\Http\Requests\Servers\Store::class => Policies\ServerPolicy::class,
];
然后在Request中的authorize()方法中,我这样做了:
return policy($this)->index();
or
return policy($this)->create();
但是,您无需将对象传递给策略。相反,你可以传递类字符串。
因此,我只需要将控制器映射到策略:
protected $policies = [
\App\Http\Controllers\Admin\Servers::class => Policies\ServerPolicy::class
];
然后只需将控制器类路径传递给策略函数:
return policy(\App\Http\Controllers\Admin\Servers::class)->index();
因此,您不需要传递映射对象,您可以将完全限定的类名称作为字符串传递。