锁定属性
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 将继续让公共属性默认情况下可以自由更改,并为开发人员提供根据需要锁定它们的工具。