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
规则被添加到字段 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
正如 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 等不同
希望这对您有所帮助。
我想优化代码以使其更高效和可扩展。
所以我想将这部分合并为一个:
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
规则被添加到字段 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
正如 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 等不同
希望这对您有所帮助。