我有一些政策,例如
CoursePolicy
,
PostPolicy
,
CommentPolicy
在 Laravel 策略文件夹中定义。
以及我在
AuthServiceProviderClass
的boot方法中注册了策略数组下的所有策略。
但是Laravel如何知道在控制器类中编写时应该调用哪个策略类的方法(在本例中是视图方法)!?
$this->authorize( 'view', Course::findOrFail( $course ) );
在执行策略时,对于每个
model
,您都会执行相应的policy
来授权用户操作(这些操作与查看、创建、更新和删除资源有关)。
注册策略时,您通知 Laravel 在授权针对给定
policy
类型的操作时使用哪个 model
。
如果您在通过 Artisan 控制台生成策略时使用了
--model
选项(例如:php artisan make:policy CoursePolicy --model=Course
),则它已经包含 viewAny
、view
、create
、update
、delete
的方法
、restore
和 forceDelete
操作。
您使用的是 Controller Helpers
$this->authorize()
,因此您需要在正确的方法上写入操作名称,如果失败将返回 403 异常。
这是控制器方法<->策略方法的映射,因此您不必在不同的方法上命名其他策略。
控制器方法 | 政策方法 |
---|---|
索引 | 查看任意 |
展示 | 查看 |
商店 | 创建 |
创建 | 创建 |
编辑 | 更新 |
更新 | 更新 |
摧毁 | 删除 |
对于任何寻找答案的人: Laravel 了解基于您应该发送给他的模型的策略。根据laravel官方文档,一些策略方法(例如create)不需要模型实例。在这些情况下,您应该将类名传递给授权方法。类名将用于确定授权操作时使用哪个策略:
$this->authorize( 'create', Course::class );//this will check create method in Course Model
$this->authorize( 'create', Post::class );//this will check create method in Post Model
$this->authorize( 'create', Comment::class );//this will check create method in Comment Model