Правила Laravel с условными и пользовательскими сообщениями об ошибках

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

Поэтому я хочу объединить эту часть в одну:

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

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

1

Решение

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

$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

1

Другие решения

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

СформироватьЗапрос используется для отделения логики проверки от контроллера.

<?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

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