Laravel 5.1表单请求中的策略

时间:2015-09-15 08:14:22

标签: php laravel laravel-5.1

我正在使用Laravel 5.1,更具体地说是Authorization包。

在此软件包之前,我将使用FormRequest::authorize()方法执行所有授权检查,因为此方法专门用于授权检查。

我现在想在laravel中使用本机Authorization包,其中包括Policy文件,但我想在请求文件中使用它们。

这意味着,据我所知,每个表单请求文件都需要映射到策略文件。

当然这不可能是对的吗?如果我在每个控制器中有7个主要方法,则7个映射到单个策略文件,每个请求文件1个。如果我有20个控制器,那就是140个映射!

我知道我可以在控制器中执行auth检查,只是映射控制器,但这似乎代表Laravels的实现很差,否则为什么要将authorize()方法放在请求中?

问题

在一个理想的世界中,我希望在到达控制器之前进行策略验证检查 - 在请求中执行此操作。但我不想将每个请求文件映射到策略中。

有没有办法从请求中检索目标控制器,这样我就可以有一个映射 - controller - >策略,并从请求中引用控制器?

1 个答案:

答案 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();

因此,您不需要传递映射对象,您可以将完全限定的类名称作为字符串传递。