我正在关注Laravel门上的一个教程,其中允许使用权限'Update-Post'的用户编辑数据库中的任何帖子。此外,任何用户不管权限如何编辑他们提交的帖子。
app/provers/authserviceprovider.php:
Gate::define('update-post', function ($user, AppPost $post) {
return $user->hasAccess(['update-post']) or $user->id == $post->user_id;
});
路由/web.php:
Route::get('/edit/{post}', 'PostController@edit')
->name('edit_post')
->middleware('can:update-post,post');
Route::post('/edit/{post}', 'PostController@update')
->name('update_post')
->middleware('can:update-post,post');
我正在寻找的是添加新许可的一种方法,例如"更新榜首",其中只有允许获得该权限的用户可以编辑自己的帖子。
因此,例如,主持人将拥有" Update Post"的权限" Update-Post",该权限允许他们编辑所有帖子。普通用户只有在分配了新的权限"更新启动post"的情况下才能编辑自己的帖子,但不是当前实施的每个用户。
在我的代码中实施此更改的最佳方法是什么?
在门中,您要检查用户的类型,因此,如果以下一个是正确的,则应该能够编辑:
-
$user->hasAccess(['update-post'])
-
$user->id == $post->user_id
-
$user->isModerator()
我不知道您如何设置用户类型,但是我建议在检查用户类型的用户模型中添加一种方法,以及用户的类型是"主持人"或您选择的任何名称,它应该返回true。
您会留下类似的东西:
Gate::define('update-post', function ($user, AppPost $post) {
return $user->hasAccess(['update-post']) || $user->id == $post->user_id || $user->isModerator();
});
编辑 - 评论回答
根据您的评论,您可以像这样完成,这是已清理的代码:
Gate::define('update-post', function ($user, AppPost $post) {
return ($user->id == $post->user_id && $user->hasAccess(['update-own-post'])) || $user->hasAccess(['update-post']);
});
此作用的原因是因为您检查{first condition} OR {second condition}
是否符合标准。如果第一个块是正确的,那么第二块甚至不会执行;但是,如果第一个块不正确,则将检查第二个块以查看它是否为真。