锁定属性

您是视觉学习者吗?
通过我们深入的屏幕录制掌握 Livewire
立即观看

Livewire 属性可以使用诸如 wire:model 的实用程序在前端和后端自由修改。如果您想防止属性(如模型 ID)在前端被修改,可以使用 Livewire 的 #[Locked] 属性。

基本用法

下面是一个 ShowPost 组件,它将 Post 模型的 ID 存储为名为 $id 的公共属性。为了防止好奇或恶意用户修改此属性,您可以在属性中添加 #[Locked] 属性

确保导入属性类

确保导入任何属性类。例如,下面的 #[Locked] 属性需要以下导入 use Livewire\Attributes\Locked;

use Livewire\Attributes\Locked;
use Livewire\Component;
 
class ShowPost extends Component
{
#[Locked]
public $id;
 
public function mount($postId)
{
$this->id = $postId;
}
 
// ...
}

通过添加 #[Locked] 属性,您可以确保 $id 属性永远不会被篡改。

模型属性默认情况下是安全的

如果您将 Eloquent 模型存储在公共属性中,而不是仅存储模型的 ID,Livewire 将确保 ID 不会被篡改,而无需您显式地将 #[Locked] 属性添加到该属性。在大多数情况下,这是一种比使用 #[Locked] 更好的方法

class ShowPost extends Component
{
public Post $post;
 
public function mount($postId)
{
$this->post = Post::find($postId);
}
 
// ...
}

为什么不使用受保护的属性?

您可能会问自己:为什么不只对敏感数据使用受保护的属性?

记住,Livewire 仅在网络请求之间持久化公共属性。对于静态、硬编码数据,受保护属性是合适的。但是,对于在运行时存储的数据,您必须使用公共属性以确保数据正确持久化。

Livewire 无法自动执行此操作吗?

在理想的世界中,Livewire 会默认锁定属性,并且仅在该属性上使用 `wire:model` 时才允许修改。

不幸的是,这将要求 Livewire 解析您的所有 Blade 模板,以了解属性是否由 `wire:model` 或类似的 API 修改。

这不仅会增加技术和性能开销,而且还无法检测到属性是否被 Alpine 或任何其他自定义 JavaScript 改变。

因此,Livewire 将继续让公共属性默认情况下可以自由更改,并为开发人员提供根据需要锁定它们的工具。