Laravel策略自动检测

时间:2019-05-26 06:43:27

标签: php laravel laravel-5.8

今天,我在ProfileController中创建了USER个人资料页面,并将其返回到个人资料页面,个人资料设置等。

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

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

所以我的步骤:

  1. php artisan make:policy ProfilePolicy(无模型)
  2. AuthServiceProvider属性中向$policies注册的策略
  3. edit内部编写了ProfilePolicy之类的方法

然后我开始考虑如何将其定义为控制器hmmm,文档并不能帮助我:/

所以我尝试了刀片@can('edit', $user)方法,它可以工作,但是 HOW 吗?如何为一个Controller定义特定策略? (不是模型),如何为单个控制器定义多个策略

我可能由于命名而失去了Laravel Magic如何做到这一点? ProfileController => ProfilePolicy?

1 个答案:

答案 0 :(得分:0)

在控制器中,您可以编写此代码

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

Laravel这样做:

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

在刀片中,@can指令执行完全相同的操作。

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