【问题标题】:Laravel 5 Form request, require input on create, but optional on editLaravel 5 表单请求,创建时需要输入,但编辑时可选
【发布时间】:2018-12-02 19:40:36
【问题描述】:

我正在使用 laravel 5.6 resources controllersform request 问题是我有一些输入是 required 在创建时,但在编辑时是文件输入等选项。所以我有这个表单请求

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ProgramRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
        return [
            //
            'name.*'        => 'required',
            'description.*' => 'required',
            'logo'          => 'required|image|max:3000',
            'logo_alt'      => 'required|image|max:3000'
        ];
    }
}

创建程序时必须发送字段logologo_alt,但在编辑程序时发送logo 是可选的。

有没有办法用相同的form request 验证这两种情况,或者我必须创建一个不同的form request 来进行编辑和创建?

【问题讨论】:

    标签: laravel laravel-5 laravel-5.6 laravel-validation laravel-request


    【解决方案1】:

    您可以使用$this-&gt;method() 来检查使用了哪种请求方法,并针对每种情况显示不同的规则:

    public function rules()
        {
            switch($this->method())
            {
                case 'GET':
                case 'DELETE':
                {
                    return [];
                }
                case 'POST':
                {
                     return [
                       'name.*'        => 'required',
                       'description.*' => 'required',
                       'logo'          => 'required|image|max:3000',
                       'logo_alt'      => 'required|image|max:3000'
                    ];
                }
                case 'PUT':
                {
                    return [
                       'description.*' => 'required',
                       'logo'          => 'nullable|image|max:3000',
                       'logo_alt'      => 'nullable|image|max:3000'
                    ];
                }
                case 'PATCH':
                {
                    return [];
                }
                default:break;
            }
        }
    

    在上面的示例中,POST 将用于您的创建,PUT 将用于您的更新。

    请注意,我已将 nullable 用于 PUT 验证规则,这告诉请求对象该字段是可选的。

    【讨论】:

    • 有什么方法可以让我们不用重复验证吗?像使用 switch case 之类的东西只用于字段描述。谢谢你的回答顺便说一句
    【解决方案2】:

    代替:

     return [
                //
                'name.*'        => 'required',
                'description.*' => 'required',
                'logo'          => 'required|image|max:3000',
                'logo_alt'      => 'required|image|max:3000'
            ];
    

    你可以使用:

    $rules =  [
        'name.*'        => 'required',
        'description.*' => 'required',
        'logo'          => ['image', 'max:3000'],
        'logo_alt'      => ['image', 'max:3000'],
    ];
    
    if ($this->isMethod('POST')
    {
       $rules['logo'][] = 'required';
       $rules['logo_alt'][] = 'required';
    }
    
    return $rules;
    

    所以基本上你有更新的规则,但除了 POST 方法你需要 logo 和 logo_alt。你也可以使用管道语法|,但是使用数组语法来规则更方便,这样你以后可以在需要时做这些事情。

    【讨论】:

      【解决方案3】:

      我知道我迟到了。但我找到了一些更好的解决方案,像这样

      $requiredOrNull = '';
      switch ($this->method()) {
          case 'POST':
              $requiredOrNull = 'nullable';
              break;
          case 'PUT':
              $requiredOrNull = 'required';
              break;
      }
      return [
            //
            'name.*'        => 'required',
            'description.*' => 'required',
            'logo'          => $requiredOrNull . '|required|image|max:3000',
            'logo_alt'      => $requiredOrNull . '|required|image|max:3000'
        ];
      }
      

      基本上它检查方法是否是post,你的logologo_alt是必需的,但如果方法是put,它将是可空的

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-10
        • 1970-01-01
        • 2018-06-08
        • 2019-06-19
        • 2016-05-03
        • 2019-01-31
        • 2021-01-07
        相关资源
        最近更新 更多