【问题标题】:Laravel 5.1 Policies in Form RequestsLaravel 5.1 表单请求中的策略
【发布时间】:2015-12-11 09:51:38
【问题描述】:

我正在开发 Laravel 5.1,更具体地说是 Authorization 包。

在这个包之前,我会在FormRequest::authorize() 方法中进行所有的授权检查,因为这个方法是专门为授权检查而设计的。

我现在想在 laravel 中使用原生的 Authorization 包,其中包含 Policy 文件,但我想在 Request 文件中使用它们。

这意味着,据我所知,每个表单请求文件都需要映射到策略文件。

这肯定不对吧?如果我在每个控制器中有 7 个主要方法,那就是 7 个映射到单个策略文件,每个请求文件 1 个。如果我有 20 个控制器,那就是 140 个映射!

我知道我可以在控制器中进行身份验证检查,并且只映射控制器,但这似乎代表 Laravel 的实现很糟糕,否则为什么要在请求中放入 authorize() 方法?

问题

在理想情况下,我想在到达控制器之前检查我的策略身份验证 - 通过在请求中进行。但我不想将我的每个请求文件都映射到策略。

有没有办法从请求中检索目标控制器,这样我就可以只拥有一个映射 - 控制器 -> 策略,并从请求中引用控制器?

【问题讨论】:

    标签: php laravel laravel-5.1


    【解决方案1】:

    其实我刚刚发现了一个很简单的方法,感觉有点傻我没有早点尝试过!

    在我的AuthServiceProvider 文件中,我已将每个请求映射到策略文件,如下所示:

    protected $policies = [
        \App\Http\Requests\Servers\Index::class => Policies\ServerPolicy::class,
        \App\Http\Requests\Servers\Create::class => Policies\ServerPolicy::class,
        \App\Http\Requests\Servers\Store::class => Policies\ServerPolicy::class,
    ];
    

    然后在我的请求中的 authorize() 方法中,我正在这样做:

    return policy($this)->index();
       or
    return policy($this)->create();
    

    但是,您不需要将对象传递给策略。相反,您可以只传递类字符串。

    因此,我只需要将控制器映射到策略:

    protected $policies = [
        \App\Http\Controllers\Admin\Servers::class => Policies\ServerPolicy::class
    ];
    

    然后只需将控制器类路径传递给策略函数:

    return policy(\App\Http\Controllers\Admin\Servers::class)->index();
    

    所以不需要传递映射对象,可以将全限定类名作为字符串传递。

    【讨论】:

      猜你喜欢
      • 2016-03-11
      • 2015-11-07
      • 2016-01-20
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      • 2015-09-24
      • 2016-05-16
      • 2018-01-16
      相关资源
      最近更新 更多