Laravel 5.6 对多个输入字段进行简单验证
Laravel 5.6 make an easy validation on multiple input fields
我刚开始学习 Laravel 并且仍在努力学习漂亮的编码。
我有一个这样的代码,可以在提交更新表单时验证输入字段,它有许多不必要的代码,可以修改以使其更短更好。
所以我的问题是,我应该采用什么方法或技术来重写我的代码以使其简短美观。
public function update(Request $request, $id)
{
$product = Product::find($id);
if ($product->name != $request->name AND $product->sku != $request->sku AND $product->description != $request->description) {
$this->validate($request, [
'name' => 'required|unique:products,name',
'sku' => 'required|unique:products,sku',
'description' => 'required'
]);
} elseif ($product->name != $request->name AND $product->sku != $request->sku) {
$this->validate($request, [
'name' => 'required|unique:products,name',
'sku' => 'required|unique:products,sku'
]);
} elseif ($product->name != $request->name AND $product->description != $request->description) {
$this->validate($request, [
'name' => 'required|unique:products,name',
'description' => 'required'
]);
} elseif ($product->description != $request->description AND $product->sku != $request->sku) {
$this->validate($request, [
'description' => 'required',
'sku' => 'required|unique:products,sku'
]);
} elseif ($product->name != $request->name) {
$this->validate($request, [
'name' => 'required|unique:products,name'
]);
} elseif ($product->description != $request->description) {
$this->validate($request, [
'description' => 'required'
]);
} elseif ($product->sku != $request->sku) {
$this->validate($request, [
'sku' => 'required|unique:products,sku'
]);
} else {
return redirect('products/' . $product->id)->with('info', 'Product does not changed!');
}
}
看起来您有两个问题需要解决以缩短代码:
- 1) 产品名称和 sku 字段是必需的,但您希望避免与您计划更新的产品上存在的值发生冲突。
- 2) description 字段实际上不是必需的,但如果它存在,则不能对其进行验证。 (不应该有
min:1
验证之类的吗?)
因此,要解决 #1,您需要编写自己的 unique
规则来忽略当前 $product
,您在确定唯一值时正尝试更新该规则。参见 Forcing A Unique Rule To Ignore A Given ID -- Laravel Docs
要解决#2,您可以使用 sometimes
验证 Conditionally Adding Rules -- Laravel Docs
结合这些应该允许你使用像这样的单个验证语句:
use Illuminate\Validation\Rule;
...
$this->validate($request, [
'name' => [
'required',
Rule::unique('products')->ignore($product->id)
],
'sku' => [
'required',
Rule::unique('products')->ignore($product->id)
],
'description' => Rule::sometimes('description', 'required', function($input){
return $input->description !== $product->description;
});
]);
如果这不正确,请为下一个路过的人更新此答案。希望这有帮助。
[提示:]这似乎是一个远景,但如果描述字段是客户端界面上的所见即所得字段,我已经让他们达到了文本字段的最大长度,因为他们可以将图像转换为 base64,所以即使尽管在大多数情况下不太可能,但我尝试将 max:65535
合并到验证中,以便它优雅地失败。 (65535 是 MySQL 文本字段的最大长度其他数据库的大小不同)
我刚开始学习 Laravel 并且仍在努力学习漂亮的编码。
我有一个这样的代码,可以在提交更新表单时验证输入字段,它有许多不必要的代码,可以修改以使其更短更好。
所以我的问题是,我应该采用什么方法或技术来重写我的代码以使其简短美观。
public function update(Request $request, $id)
{
$product = Product::find($id);
if ($product->name != $request->name AND $product->sku != $request->sku AND $product->description != $request->description) {
$this->validate($request, [
'name' => 'required|unique:products,name',
'sku' => 'required|unique:products,sku',
'description' => 'required'
]);
} elseif ($product->name != $request->name AND $product->sku != $request->sku) {
$this->validate($request, [
'name' => 'required|unique:products,name',
'sku' => 'required|unique:products,sku'
]);
} elseif ($product->name != $request->name AND $product->description != $request->description) {
$this->validate($request, [
'name' => 'required|unique:products,name',
'description' => 'required'
]);
} elseif ($product->description != $request->description AND $product->sku != $request->sku) {
$this->validate($request, [
'description' => 'required',
'sku' => 'required|unique:products,sku'
]);
} elseif ($product->name != $request->name) {
$this->validate($request, [
'name' => 'required|unique:products,name'
]);
} elseif ($product->description != $request->description) {
$this->validate($request, [
'description' => 'required'
]);
} elseif ($product->sku != $request->sku) {
$this->validate($request, [
'sku' => 'required|unique:products,sku'
]);
} else {
return redirect('products/' . $product->id)->with('info', 'Product does not changed!');
}
}
看起来您有两个问题需要解决以缩短代码:
- 1) 产品名称和 sku 字段是必需的,但您希望避免与您计划更新的产品上存在的值发生冲突。
- 2) description 字段实际上不是必需的,但如果它存在,则不能对其进行验证。 (不应该有
min:1
验证之类的吗?)
因此,要解决 #1,您需要编写自己的 unique
规则来忽略当前 $product
,您在确定唯一值时正尝试更新该规则。参见 Forcing A Unique Rule To Ignore A Given ID -- Laravel Docs
要解决#2,您可以使用 sometimes
验证 Conditionally Adding Rules -- Laravel Docs
结合这些应该允许你使用像这样的单个验证语句:
use Illuminate\Validation\Rule;
...
$this->validate($request, [
'name' => [
'required',
Rule::unique('products')->ignore($product->id)
],
'sku' => [
'required',
Rule::unique('products')->ignore($product->id)
],
'description' => Rule::sometimes('description', 'required', function($input){
return $input->description !== $product->description;
});
]);
如果这不正确,请为下一个路过的人更新此答案。希望这有帮助。
[提示:]这似乎是一个远景,但如果描述字段是客户端界面上的所见即所得字段,我已经让他们达到了文本字段的最大长度,因为他们可以将图像转换为 base64,所以即使尽管在大多数情况下不太可能,但我尝试将 max:65535
合并到验证中,以便它优雅地失败。 (65535 是 MySQL 文本字段的最大长度其他数据库的大小不同)