Laravel 策略自动检测

Laravel policy autodetect

今天我正在创建 USER 个人资料页面,它在 ProfileController 中进行控制,它返回对个人资料页面、个人资料设置等的视图

所以我决定制定一些政策规则来编辑个人资料等

所以我发现我应该使用 Middleware / Gates / Policy,基于 Laravel Doc 我选择了 Policy 因为 profil 页面是 public 但只有它的特定部分可以作者编辑所以我需要 @可以

所以我的步骤:

  1. php artisan make:policy ProfilePolicy(无模型)
  2. 已在 $policies 属性
  3. 中将政策注册到 AuthServiceProvider
  4. ProfilePolicy
  5. 里面写了像edit这样的方法

然后我开始考虑如何将它定义到我的控制器嗯,文档对我没有帮助:/

所以我尝试了 blade @can('edit', $user) 方法并且它有效,但是 HOW ?如何为一个控制器定义特定策略? (不是模型),如何为单个控制器定义多个策略

我不知道 laravel Magic 是如何做到这一点的,也许是因为命名?配置文件控制器 => 配置文件策略?

在控制器中你可以这样写

public function edit(Profile $profile) {
   $this->authorize('edit', $profile)
}

Laravel 这样做:

  • 检查$profile的类型,是Profile::class
  • 检查为 class(您的第 2 步)注册的政策
  • 在该策略中查找 edit 方法,如果未找到,return false 表示用户 授权
  • 执行 returns true/false
  • edit() 函数

在 blade 中,@can 指令做同样的事情。

策略是为了绑定到模型,这是一种编写规则来处理单个模型的便捷方式,但它们可以通过多种方式触发(例如控制器中的 authorize() 方法和 @can 中的指令 blade).