为包括未经授权用户的一组用户实现某种@can



我正在编写一个建议(或想法(应用程序。逻辑很简单,只有登录的用户才能发布想法,但任何人都可以看到想法(像StackOverflow问题一样思考(,每个想法都有一个状态:

  • 编辑
  • 张贴
  • 在评估中
  • 已实施
  • 被拒绝

等等,所以不是每个用户都能看到每个状态。例如,只有作者可以看到处于editing状态的想法,在accepted之前没有人应该看到想法。

所以我认为用政策来实施它太容易了,可以像:

public function view(User $user, Idea $idea)
{
if ($user->id === $idea->user_id) return true;
return $idea->state->visible;
}

而且。。。

@can('view', $idea)
...
@endcan

每个状态都有一个CCD_ 3列;人人可见";当CCD_;作者可见";当CCD_ 5。问题是,@can仅适用于签名用户。

我不想在@if中编写显示逻辑(如果用户是作者或状态可见(,它可以毫无问题地工作。。。

更糟糕的是,我不喜欢在Idea型号中编写类似public function getVisibleAttribute()的访问器

所以。。。我有什么选择?正确的方式是什么?

我的问题已经解决了,但我觉得dirty(我使用了@if(。

编辑:-------------------------

让我展示一下我的解决方案有多可怕:

@php $ok = false; @endphp
@auth
@php $ok = Auth::user()->id === $idea->user_id; @endphp
@endauth
@if (($idea->state->visible) || ($ok))
<!-- Display record -->
@endif

$ok是必要的,因为如果我请求Auth::user()->id,它会给我空错误的请求id

你可以试试这个

public function view(User $user, Idea $idea)
{
if ($user->id === $idea->user_id || $idea->state->visible){
return true;
}
return false;
}

由于我不喜欢我糟糕的答案,我只选择了第二个选项,至少有点干净,但我仍然不喜欢。

我在Idea模型中创建了一个访问器:

public function getIsVisibleAttribute()
{
if (Auth::guest()) return $this->estado->vis;
return ($this->estado->vis) || (Auth::user()->id === $this->user_id);
}

然后在刀片文件中使用:

@if ($idea->isVisible)
<!-- Display idea -->
@endif

我仍然认为这个规则不属于这里

最新更新