Laravel 自动发现授权策略 Automatic Policy Resolution
从 Laravel 5.8 开始,最显著的特征之一就是增加了自动发现功能,因此你不需要在 AuthServiceProvider 中注册你需要的策略。看一下它是如何工作的。
一般策略的总体运行方式如下:
步骤一: 使用 artisan 命令创建策略,并将其附加到对应的模型。
php artisan make:policy PostPolicy --model=Post
步骤二: 在新创建的策略中定义正确的方法和规则。
use App\User;
use App\Post;
class PostPolicy
{
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}
步骤三: 注册策略(仅在 Laravel 5.8 之前需要注册)
use App\Post;
use App\Policies\PostPolicy;
class AuthServiceProvider extends ServiceProvider
{
protected $policies = [
Post::class => PostPolicy::class,
];
所以,从 Laravel5.8 开始你就不需要再执行步骤三了,框架将自动识别策略。
下面是 Laravel 内部结构中自动发现策略功能的实际外观:
protected function guessPolicyName($class)
{
return dirname(str_replace('\\', '/', $class)).'\\Policies\\'.class_basename($class).'Policy';
}
因此,您的策略应位于 app/Policies 文件夹中,与模型同名,并带有 Policy 后缀。
正确的位置:app/User.php->app/Policies/UserPolicy.php
位置不正确:app/Models/User.php->app/Policies/UserPolicy.php
同样不正确:app/User.php->app/Policies/UsersPolicy.php
同样不正确:app/User.php->app/Policies/User.php
如果您的政策和模型位于“非常规位置”(例如不在 app /
或 app / Policies
文件夹中,如上所示).则可以在其中使用相同的 $policies
数组AuthServiceProvider
,或指定您自己的“猜测”逻辑:
Gate :: guessPolicyNamesUsing(function($ class){
// 做东西
return $policyClass;
});
这是[Laravel中的原始提交]的链接。
本文中的所有译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 CC 协议,如果我们的工作有侵犯到您的权益,请及时联系我们。