Laravel 5表单请求,在创建时需要输入,但在编辑时是可选的

时间:2018-06-23 16:21:18

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

我正在使用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进行编辑和创建?

3 个答案:

答案 0 :(得分:1)

您可以使用$this->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验证规则,这告诉请求对象该字段是可选的。

答案 1 :(得分:0)

代替:

 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_alt。您也可以使用管道语法|,但是将数组语法用于规则更加方便,以便以后可以在需要时执行此类操作。

答案 2 :(得分:0)

我知道我迟到了。但是我发现这样更好的解决方案

$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是必需的,但是如果放置了该方法,它将为空