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 协议》,转载必须注明作者和本文链接
这只是一个小的知识点,因为官网上没说明,国外网站很多人搜这个问题,看来咱们中国的用户都知道这个
protected $policies = [
Post::class => PostPolicy::class
];
绑定的时候一定用这种方式,不要在 boot 函数中绑定,我试过在boot函数中是不行的