php - 为包括未经授权的用户的一组用户实施某种@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
解决方案
由于我不喜欢我可怕的答案,我只是做了第二种选择,至少更干净一些,但我仍然不喜欢它。
我在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
我仍然认为规则不属于这里
推荐阅读
- reactjs - 无法在 React 中使用 Highchart 直方图
- apache-spark - 缺少必需的配置“partition.assignment.strategy”
- ethereum - 如何在智能合约中使用 swapExactETHForTokens?
- kubernetes - K8 使用大写镜像名称创建 pod
- java - 为什么Java中的最后一个地图元素不断重复
- python - filenotfound 错误 - chromedriver(网页抓取)
- python - 我们如何在python中使列表中的重复值唯一?
- c# - 如何在没有“if statement”的情况下检查 CheckBox 是否被选中?
- vue.js - 如何用 jest 测试 nuxt?
- coq - 如何使用 VST/coq 为 switch 语句编写证明?