首页 > 解决方案 > 为包括未经授权的用户的一组用户实施某种@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

每个州都有一个visible列,表示“对所有人可见” whentrue和“对作者可见” when false。问题是,@can仅适用于签名用户。

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

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

那么......我有什么选择?哪个是正确的方法?

我的问题已经解决了,但我认为它很……(我用过@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

标签: phplaravel

解决方案


由于我不喜欢我可怕的答案,我只是做了第二种选择,至少更干净一些,但我仍然不喜欢它。

我在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

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


推荐阅读