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

Php 带有条件和自定义错误消息的Laravel规则,php,laravel,custom-validators,Php,Laravel,Custom Validators,我想优化代码,使其更高效和可扩展 所以我想把这部分合并成一部分: if($request->input('logintype') == 'register'){ $validator = Validator::make($request->all(), [ 'option.*' => 'required|integer', 'quantity.*' => 'required|integer', 'conditions

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

所以我想把这部分合并成一部分:

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';
});
选中此项

您可以使用有条件地添加
所需的
规则。 在这种情况下,如果将规则添加到字段选项和条件,则为必需

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

<?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',
                                ],
        ];
    }
}

正如Kyslik所说,将此逻辑添加到
请求中
将使控制器中的事情更加整洁

<?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',
                                ],
        ];
    }
}
我倾向于使用以下样式的
请求
,其中包含验证规则和自定义验证消息。在您的情况下,它可能看起来像这样:

<?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);
    }
  }
}

将此提取到,您的控制器将感谢您。你可以在那里做各种各样的魔术,基于
if
s等进行数组合并,它看起来很酷。你的解决方案是最快、最简单、最短的