Laravel用户许可更新自己的帖子



我正在关注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"的情况下才能编辑自己的帖子,但不是当前实施的每个用户。

在我的代码中实施此更改的最佳方法是什么?

在门中,您要检查用户的类型,因此,如果以下一个是正确的,则应该能够编辑:

  1. $user->hasAccess(['update-post'])
  2. $user->id == $post->user_id
  3. $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}是否符合标准。如果第一个块是正确的,那么第二块甚至不会执行;但是,如果第一个块不正确,则将检查第二个块以查看它是否为真。

最新更新