生成授权策略
我们需要使用授权策略来对用户进行授权删除的操作,只有当被删除的微博作者为当前用户,授权才能通过。运行下面命令生成微博授权策略。
$ php artisan make:policy StatusPolicy
修改授权策略文件
我们需要在该授权策略中引入用户模型和微博模型,并添加 destroy 方法定义微博删除动作相关的授权。如果当前用户的 id 与要删除的微博作者 id 相同时,验证才能通过。
app/Policies/StatusPolicy.php
id === $status->user_id;
}
}
修改 AuthServiceProvider
我们还需要在 AuthServiceProvider 中对授权策略进行配置才能正常使用。
app/Providers/AuthServiceProvider.php
'App\Policies\ModelPolicy',
\App\Models\User::class => \App\Policies\UserPolicy::class,
\App\Models\Status::class => \App\Policies\StatusPolicy::class,
];
/**
* Register any application authentication / authorization services.
*
* @param \Illuminate\Contracts\Auth\Access\Gate $gate
* @return void
*/
public function boot(GateContract $gate)
{
$this->registerPolicies($gate);
//
}
}
添加删除按钮
需要把删除按钮加到渲染单条微博的局部视图上。并且删除按钮必须是微博的作者本人才能看到,我们可以很方便的利用 Laravel 授权策略提供的 @can Blade 命令,在 Blade 模板中做授权判断。
resources/views/statuses/_status.blade.php
{{ $user->name }}
{{ $status->content }}
@can('destroy', $status)
@endcan
定义微博动态控制器的 destroy 动作来处理微博的删除。
app/Http/Controllers/StatusesController.php
middleware('auth');
}
public function store(Request $request)
{
$this->validate($request, [
'content' => 'required|max:140'
]);
Auth::user()->statuses()->create([
'content' => $request->content
]);
return redirect()->back();
}
public function destroy(Status $status)
{
$this->authorize('destroy', $status);
$status->delete();
session()->flash('success', '微博已被成功删除!');
return redirect()->back();
}
}