Правила Laravel с условными и пользовательскими сообщениями об ошибках - PullRequest
0 голосов
/ 09 мая 2018

Я хочу оптимизировать код, чтобы сделать его более эффективным и масштабируемым.

Итак, я хочу объединить эту часть в одну:

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

Но я не уверен, что делать с пользовательскими сообщениями об ошибках.

Ответы [ 3 ]

0 голосов
/ 09 мая 2018

Вы можете использовать required_if , чтобы условно добавить правило required. В этом случае правило required_if добавляется в поля option и conditions.

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
0 голосов
/ 09 мая 2018

Как сказал Кислик, добавление этой логики к 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 и т. д.

Надеюсь, это поможет.

0 голосов
/ 09 мая 2018

Этого можно добиться, добавив дополнительный комментарий к валидатору.
Просто сделай так

$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';
});

Он проверит ваши поля ввода и выдаст определенное сообщение об ошибке. enter image description here

И вы также можете добавить несколько полей по массиву

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

Проверьте это https://laravel.com/docs/5.5/validation#conditionally-adding-rules

...