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

Laravel 5 Form request, require input on create, but optional on edit

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

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

而不是:

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

我知道我迟到了。但我发现了一些更好的解决方案,比如这样

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

基本上它会检查该方法是否为 post,您的 logologo_alt 将是必需的,但如果放置该方法,它将是可为空的