我希望优化代码,使其更高效,更具可扩展性。
所以我想将这部分合并为一部分:
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';
});
但我不确定如何处理自定义错误消息。
答案 0 :(得分: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 :(得分:0)
您可以使用 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
答案 2 :(得分:0)
正如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之间有所不同等。
希望这有帮助。