我意识到这是一个有点普遍的问题。我想它可以最好地概括为“如果我没有将任何面向用户的属性直接绑定到模型,我是否需要担心这些模型的变化”?
我正在开发的 Laravel / Livewire 项目有不同级别的管理员用户,因此在多个阶段我需要检查用户是否有权执行他们想要执行的操作。
由于我不会详细说明的原因,我使用自定义方法来执行此操作,而不是 Laravel 的门,但我很高兴该过程返回正确的答案(即“是的,他们可以做到这一点”或“不,他们不能这样做”)。
因此,例如,具有正确权限的管理员可以管理另一个用户。使用一个实际示例,他们可以在他们拥有相关权限的事件中管理用户的列表。列表的批量管理通过 Livewire Modal 组件进行处理。
该模式已安装相关卖家和事件:
public $seller;
public $event;
public function mount(User $seller, Event $event) {
$this->seller = $seller;
$this->event = $event;
}
在渲染时,将检索登录用户并检查其权限。如果他们具有正确的权限,则会向他们显示相关模式,如果没有,则会向他们显示“您无权执行此操作”模式:
public function render()
{
$user = Auth::user();
if(!$user->eventRolesInclude(['owner', 'relevantrights'], $this->event)) {
return view('main.forbidden');
}
return view('livewire.admin.modals.specific.modal');
}
模态本身仅包含一个关闭按钮和一个执行相关操作的按钮。它仅使用
$seller
属性来自定义页面上的措辞(商品数量、卖家名称等)。
当管理员单击操作按钮时,它会调用组件内的函数来执行必要的操作:
public function doSomething()
{
$admin = Auth::user();
if(!$admin->eventRolesInclude(['owner', 'relevantrights'], $this->event)) {
$this->alert('warning', "You do not have the right role to do this");
return false;
}
$listings = $this->seller->getListingsForEvent($this->event);
// Go on and do stuff
我想我的问题是这样的:
如果我除了在模式中输出卖家名称之外没有使用 $seller 模型(在本例中),我是否需要担心它会以任何方式更改?在 doSomething() 方法中,我能否确信 $this->seller 不会返回除 mount() 方法中实例化的卖家之外的任何卖家?在任何情况下,了解网站前端开发人员工具的人都可以更改该属性吗?
同样,如果我在 render() 方法中获取登录用户,是否需要在 doSomething() 方法中再次获取它?或者在 mount() 方法中获取 $admin 用户,将其分配给公共属性,然后在 doSomething() 方法中使用 $this->admin 调用该公共属性会更有效吗?