Laravel 条带条件和自定义错误消息的规则

Laravel rules with condition and custom error messages

我想优化代码以使其更高效和可扩展。

所以我想将这部分合并为一个:

if($request->input('logintype') == 'register'){
    $validator = Validator::make($request->all(), [
        'option.*' => 'required|integer',
        'quantity.*' => 'required|integer',
        'conditions' => 'required',
        'comission' => 'required',
    ],[
        'option.integer' => 'Debe introducir una opción válida',
        'quantity.required' => 'Introduzca una cantidad a comprar',
        'quantity.integer'  => 'Debe introducir una cantidad válida',
        'quantity.*.max'  => 'Se ha superado el límite máximo de tickets por persona',
        'conditions.required'  => 'Debe aceptar los Términos y Condiciones',
        'comission.required'  => 'Debe seleccionar el método de pago',
    ]);

}
else{
    $validator = Validator::make($request->all(), [
        'option.*' => 'integer',
        'quantity.*' => 'required|integer',
        'comission' => 'required',
    ],[
        'option.integer' => 'Debe introducir una opción válida',
        'quantity.required' => 'Introduzca una cantidad a comprar',
        'quantity.integer'  => 'Debe introducir una cantidad válida',
        'quantity.*.max'  => 'Se ha superado el límite máximo de tickets por persona',
        'comission.required'  => 'Debe seleccionar el método de pago',

    ]);

}

我已经检查过此代码是否可行:

$validator->sometimes('conditions', 'required', function($request){
   return $request->input('logintype') == 'register';
});

但我不确定如何处理自定义错误消息。

您可以通过向验证器添加额外注释来实现此目的。
就这样

$validator = Validator::make($request->all(), [
    'option.*' => 'required|integer',
    'quantity.*' => 'required|integer',
    'comission' => 'required',
],[
    'option.integer' => 'Debe introducir una opción válida',
    'quantity.required' => 'Introduzca una cantidad a comprar',
    'quantity.integer'  => 'Debe introducir una cantidad válida',
    'quantity.*.max'  => 'Se ha superado el límite máximo de tickets por persona',
    'conditions.required'  => 'Debe aceptar los Términos y Condiciones',
    'comission.required'  => 'Debe seleccionar el método de pago',
]);
$validator->sometimes('conditions', 'required', function($request){
    return $request->input('logintype') == 'register';
});

它将验证您的输入字段并给出您的定义错误消息检查此

你也可以通过数组添加多个字段

$validator->sometimes(['conditions','option'], 'required', function($request){
    return $request->input('logintype') == 'register';
});

勾选这个https://laravel.com/docs/5.5/validation#conditionally-adding-rules

您可以使用required_if来有条件地添加required规则。 在这种情况下 required_if 规则被添加到字段 optionconditions.

FormRequest用于将验证逻辑与控制器分离。

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class YourRequestClassName extends FormRequest
{
    public function authorize()
    {
        return true;
    }

    public function messages()
    {
        return [
                'option.integer' => 'Debe introducir una opción válida',
                'quantity.required' => 'Introduzca una cantidad a comprar',
                'quantity.integer'  => 'Debe introducir una cantidad válida',
                'quantity.*.max'  => 'Se ha superado el límite máximo de tickets por persona',
                'conditions.required_if'  => 'Debe aceptar los Términos y Condiciones',
                'comission.required'  => 'Debe seleccionar el método de pago',
            ];
    }

    public function rules()
    {

        return [
            'option.*'      =>  [
                                    'required_if:logintype,register',
                                    'nullable',
                                    'integer',
                                ],
            'quantity.*'    =>  [
                                    'required',
                                    'nullable',
                                    'integer',
                                ],
            'conditions'    =>  [
                                    'required_if:logintype,register',
                                    'nullable',
                                ],
            'comission'     =>  [
                                    'required',
                                ],
        ];
    }
}

在您的控制器中,您可以将 App\Http\Requests\YourRequestClassName 注入方法。

use App\Http\Requests\YourRequestClassName;

public function registerAction(YourRequestClassName $request)
    {
        //rest of the controller code

正如 Kyslik 所说,将此逻辑添加到 Request 将使您的控制器中的内容更加整洁。

我倾向于使用以下 Request 样式,其中包含验证规则和自定义验证消息。在您的情况下,它可能看起来像这样:

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Validator;

class LoginRequest 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()
  {
    if ($this->input('logintype') == 'register') {
      return [
        'option.*' => 'required|integer',
        'quantity.*' => 'required|integer',
        'conditions' => 'required',
        'comission' => 'required',
      ];
    }

    return [
      'option.*' => 'integer',
      'quantity.*' => 'required|integer',
      'comission' => 'required',
    ];
  }

  public function messages()
  {
    if ($this->input('logintype') == 'register') {
      return [
        'option.integer' => 'Debe introducir una opción válida',
        'quantity.required' => 'Introduzca una cantidad a comprar',
        'quantity.integer'  => 'Debe introducir una cantidad válida',
        'quantity.*.max'  => 'Se ha superado el límite máximo de tickets por persona',
        'conditions.required'  => 'Debe aceptar los Términos y Condiciones',
        'comission.required'  => 'Debe seleccionar el método de pago',
      ];
    }

    return [
      'option.integer' => 'Debe introducir una opción válida',
      'quantity.required' => 'Introduzca una cantidad a comprar',
      'quantity.integer'  => 'Debe introducir una cantidad válida',
      'quantity.*.max'  => 'Se ha superado el límite máximo de tickets por persona',
      'comission.required'  => 'Debe seleccionar el método de pago',
    ];
  }

  public function validate()
  {
    return Validator::make(parent::all(), $this->rules(), $this->messages());
  }
}

在控制器中这样使用:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Requests\LoginRequest;

class LoginController extends Controller
{
  public function search(LoginRequest $request)
  {
    $status_code = 200;
    $response = [];

    try {
      $validator = $request->validate();
      if ($validator->fails()) {
        // throw new ValidationException or something similar
      }

    } catch (Exception $e) {
      // Deal with it
    } finally {
      return response()->json($response, $status_code);
    }
  }
}

如您所见,它使控制器更整洁。

在您的 LoginRequest 中,您可以对其进行大量自定义,根据某些输入或使用的 HTTP 方法更改规则,例如POST 和 GET 等不同

希望这对您有所帮助。