【问题标题】:Laravel policy autodetectLaravel 策略自动检测
【发布时间】:2019-05-26 06:43:26
【问题描述】:

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

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

所以我发现我应该使用中间件/盖茨/策略,基于 Laravel Doc 我选择了策略,因为配置文件页面是公开的,但只有特定部分可以作者编辑,所以我需要 @can

所以我的步骤:

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

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

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

我迷失了 laravel Magic 是如何做到这一点的,可能是因为命名? ProfileController => ProfilePolicy ?

【问题讨论】:

    标签: php laravel laravel-5.8


    【解决方案1】:

    在控制器中你可以这样写

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

    Laravel 这样做:

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

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

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

    【讨论】:

    • ehh,我知道我可以,但这对于编辑 POST 请求或编辑 Ajax 数据来说是可以的,但是如果你有多个任务的页面,你想添加内联编辑,你不能像这样使用它这个,我也想知道 laravel 如何计算出他应该与我的控制器 + 视图配对的策略(由控制器返回),以及如何为控制器定义自定义策略,如 123132321Policy(没有名称对)
    • 我想我已经清楚地解释了 Laravel 如何理解哪个 Policy 与哪个模型相关联。请记住,可以为模型而非控制器定义策略。
    • 所以它不可能给随机控制器随机策略?例如 TestController 和 TestNewPolicy ?
    • 同样,政策适用于没有控制器的型号。
    • 我没有配置文件模型,所以它必须绑定到控制器,控制器也返回视图,你可以使用@can方法,那么没有模型怎么办...?
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-15
    相关资源
    最近更新 更多