Laravel 5.6可以轻松验证多个输入字段

时间:2018-09-18 09:07:07

标签: laravel validation laravel-5.6

我对学习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!'); 
        }

    }

2 个答案:

答案 0 :(得分:1)

您可以使用必填项制作表格,他们会对其进行验证。

 <form method="post" action="url">
      <input type="text" name="username" required>
 </form>

并在控制器中创建验证器。

Like This

答案 1 :(得分:1)

您似乎需要解决两个问题以缩短代码:

  • 1)产品名称和sku字段为必填字段,但您要避免与计划更新的产品上存在的值冲突。
  • 2)描述字段实际上不是必需的,但是如果存在,则必须对其进行验证。 (应该没有min:1验证吗?)

因此,要解决#1,您需要编写自己的unique规则,以忽略在确定唯一值时要尝试更新的当前$product。参见Forcing A Unique Rule To Ignore A Given ID -- Laravel Docs

要解决第二个问题,您可以使用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;
    });
]);

如果这不正确,请为下一个偶然发现的人更新此答案。希望这会有所帮助。

[提示:]这似乎是一个长镜头,但是如果描述字段是客户端界面上的WYSIWYG字段,则我让它们达到了文本字段的最大长度,因为它们可以将图像转换为base64,所以即使在大多数情况下,我不太可能尝试将max:65535纳入验证中,从而使其确实无法正常运行。 (65535是其他数据库大小不同的MySQL文本字段的最大长度)