Laravel 中 Resource Route 与 Resource Gate 如何结合到一起使用

在Laravel路由系统中有Resource 类型的路由,5.3版本后引入了官方的权限授权系统,实现方式采用了与 Route-Controller 非常相似的 Gate-Policy 模式,而且 Gate 定义的时候也可以定义 Resource 类型的 Gate,既然都是官方的实现方式,且路由与权限系统结合也非常紧密,那有没有简单的方式把 Resource Route 和 Resource Gate 结合起来实现路由的权限验证呢,虽然官方文档中没有写(这么关键的内容都不说,也是够坑自己的),但是其实是有的,而且方式真的特别简单优雅,只需要一条语句即可。在中文的论坛中大家应该也没见过这种用法,是我在国外论坛网站发现的。

我们以文章的CRUD(增删改查)权限和文章的 CRUD (增删改查)操作为例,我们先来看看文章的定义,我在里面定义了 user_id 和 title 字段,user_id 用来存储作者的 id 信息。

  class Post extends Model
  {
      protected $fillable = [ 'user_id', 'title' ];
  }

路由定义采用 Resource 定义方式:

Route::resource('posts','PostController');

PostController 中就是默认创建的 CRUD 操作,就不贴代码了。接下来看权限定义的部分,权限定义文件如下,咱们在app\providers\AuthServiceProvider.php 的映射数组中添加如下代码进行 Resource 类型 Gate Policy 的映射:

 class AuthServiceProvider extends ServiceProvider
  {
      # 在这里关联好 Post 实体和权限定义的 PostPolicy
      protected $policies = [
          Post::class => PostPolicy::class        
      ];

      public function boot()
      {
          $this->registerPolicies();       
      }
  }

PostPolicy.php 使用 php artisan make:policy PostPolicy --model=Post 创建的:

  class PostPolicy
  {
      use HandlesAuthorization;

      public function view(User $user, Post $post)
      {
          if ($user->id == $post->user_id) {
              return true;
          }
          return false;
      }

      public function create(User $user)
      {
          ......    
      }

      public function update(User $user, Post $post)
      {
           ......
      }

      public function delete(User $user, Post $post)
      {
           ......
      }

      public function restore(User $user, Post $post)
      {
           ......
      }

      public function forceDelete(User $user, Post $post)
      {
            ......
      }
  }

铺垫了这么多,其实都是大家熟悉的内容,接下来才是咱们的重点,也就是实现Resource Route 和 Resource Gate & Policy 的关联方式,非常简单,PostController 的构造函数中添加一行代码:

  class PostController extends Controller
  {
      public function __construct()
      {      
          $this->authorizeResource(Post::class);  
      }
     .......
     .......
  }

凑字数都凑得这么没节操了,其实就是一句话的事儿 ~
原文位置: http://www.coding10.com/post/laravel-resource-route-and-resource-gate

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 2
codinget

这只是一个小的知识点,因为官网上没说明,国外网站很多人搜这个问题,看来咱们中国的用户都知道这个

5年前 评论
codinget

protected $policies = [
Post::class => PostPolicy::class
];
绑定的时候一定用这种方式,不要在 boot 函数中绑定,我试过在boot函数中是不行的

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!