我正在编写一个建议(或想法(应用程序。逻辑很简单,只有登录的用户才能发布想法,但任何人都可以看到想法(像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
我仍然认为这个规则不属于这里