坑王laravel

在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);
}
.......
.......
}

凑字数都凑得这么没节操了,其实就是一句话的事儿 ~