【问题标题】:Laravel 5.6 make an easy validation on multiple input fieldsLaravel 5.6 可以轻松验证多个输入字段
【发布时间】:2019-02-22 06:34:50
【问题描述】:

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

    }

【问题讨论】:

  • 改用FormRequests。祝你好运!
  • 我确实使用 laravel 表单请求使其工作,但与此相关的问题是如何使 html 代码更短,因为如您所见,我使用条件 if else 来处理 html 输入条件。

标签: laravel validation laravel-5.6


【解决方案1】:

看起来您有两个问题需要解决以缩短代码:

  • 1) 产品名称和 sku 字段是必需的,但您希望避免与您计划更新的产品上存在的值发生冲突。
  • 2) 描述字段实际上不是必需的,但是当它存在时,它必须不经过验证。 (不应该有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;
    });
]);

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

[提示:] 这似乎是一个很长的镜头,但如果描述字段是客户端界面上的 WYSIWYG 字段,我已经让他们达到了文本字段的最大长度,因为他们可以将图像转换为 base64,所以即使它是在大多数情况下不太可能我尝试将max:65535 合并到验证中,以便它优雅地失败。 (65535 是 MySQL 文本字段的最大长度,其他数据库大小不同)

【讨论】:

    猜你喜欢
    • 2019-01-07
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 2019-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多