Laravel 在商店和更新上的表单请求验证使用相同的验证
Posted
技术标签:
【中文标题】Laravel 在商店和更新上的表单请求验证使用相同的验证【英文标题】:Laravel form request validation on store and update use same validation 【发布时间】:2020-08-15 23:22:54 【问题描述】:我创建 laravel 表单验证请求并对该验证有独特的规则。
我想在 store
和 update
方法上使用它,而无需再次创建新的表单请求验证。
但问题是在store
上,id 不存在并且验证通过
当在update
上时,我没有通过验证,因为 id 存在于存储中
我想忽略 unique
规则中的 id 但使用相同的表单验证请求
如果此操作来自 store 或 update 方法以忽略唯一 ID,则检查表单验证请求类的最佳做法是什么?
【问题讨论】:
您可以检查是否有一个名为_method
的输入,其值为“put”或“patch”,以了解其是否为更新请求
我用的方法跟你一样。不过没问题
【参考方案1】:
我正在使用这个
$validated = $request->validated();
使用这个方法:
public function createAccount(RegisterRequest $request)
$attr = $request->validated();
而不是这样的:
public function createAccount(Request $request)
$attr = $request->validate([
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
]);
使用php artisan make:request RegisterRequest
public function rules()
return [
'name' => 'required|string|max:255',
'email' => 'required|string|email|unique:users,email',
'password' => 'required|string|min:6|confirmed'
];
【讨论】:
【参考方案2】:试试这个,它对我有用。
Laravel 唯一性:第三个参数可以排除记录的 id 例如,像这样:
public function rules()
return [
'name' => 'required|string|max:255|unique:products,'.$this->id,
];
【讨论】:
【参考方案3】:好的.. 我可以像@porloscerros Ψ 建议的那样做
public function rules()
$rules = [
'name' => 'required|string|unique:products|max:255',
];
if (in_array($this->method(), ['PUT', 'PATCH']))
$product = $this->route()->parameter('product');
$rules['name'] = [
'required',
'string',
'max:255',
Rule::unique('loan_products')->ignore($product),
];
return $rules;
【讨论】:
像魅力一样工作!!!【参考方案4】:为什么在 FormRequest 中的 store
或 update
时检查 id
?你不需要这个。 id
像参数一样出现在控制器的方法中。或者 laravel 将在控制器的方法 public function update(User $user)
中使用 DI 创建模型,然后您可以像用户模型的实例一样使用 $user
。您可以查看 web.php 或 api.php 中的id
:
https://laravel.com/docs/7.x/routing#parameters-regular-expression-constraints
我建议您不要将一个 FormRequest 用于两种方法。这是不好的做法
【讨论】:
因为我对store
和update
的规则几乎相同,除了name
id 名称不能重复,并且当创建名称为product 1
的新产品时,如果存储中不存在我可以存储它.. 但是当我想编辑时验证失败,因为在存储上重复了name
,所以我需要忽略存储上的产品 ID 以通过验证。因此,如果我进行一个表单请求验证,它将很容易维护。
好的。您需要为验证此字段制定新的唯一规则。这里的文档:laravel.com/docs/7.x/validation#rule-unique以上是关于Laravel 在商店和更新上的表单请求验证使用相同的验证的主要内容,如果未能解决你的问题,请参考以下文章