繁体   English   中英

Laravel 5.1表单请求中的策略

[英]Laravel 5.1 Policies in Form Requests

我正在研究Laravel 5.1,更具体地说是授权包。

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

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

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

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

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

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

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

实际上,我刚刚发现了一个非常简单的方法,并且感觉有点愚蠢,我没有提前尝试过!

在我的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();

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM