Php 如何在Laravel 5请求类中使用有时规则
我有以下请求类:Php 如何在Laravel 5请求类中使用有时规则,php,laravel,laravel-5,Php,Laravel,Laravel 5,我有以下请求类: <?php namespace App\Http\Requests\User; use App\Http\Requests\Request; use Validator; use Session; use Auth; use App\User; class RegisterStep1Request extends Request { /** * Determine if the user is authorized to make this req
<?php namespace App\Http\Requests\User;
use App\Http\Requests\Request;
use Validator;
use Session;
use Auth;
use App\User;
class RegisterStep1Request extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Set up the validation rules
*/
public function rules()
{
Validator::extend('valid_date', function($attribute, $value, $parameters)
{
$pieces = explode('/', $value);
if(strpos($value, '/')===FALSE) {
return false;
} else {
if(checkdate($pieces[1], $pieces[0], $pieces[2])) {
return true;
} else {
return false;
}
}
});
return [
'first_name' => 'required',
'last_name' => 'required',
'email' => 'required|email|unique:users,email',
'dob' => 'required|regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/|valid_date',
'mobile' => 'required',
'password' => 'required|confirmed'
];
}
public function messages()
{
return [
'first_name.required' => 'The first name field is required.',
'last_name.required' => 'The last name field is required.',
'email.required' => 'The email address field is required.',
'email.email' => 'The email address specified is not a valid email address.',
'email.unique' => 'The email address is already registered with this website.',
'dob.required' => 'The date of birth field is required.',
'dob.regex' => 'The date of birth is invalid. Please use the following format: DD/MM/YYYY.',
'dob.valid_date' => 'The date of birth is invalid. Please check and try again.',
'mobile.required' => 'The mobile number field is required.',
'password.required' => 'The password field is required.',
'password.confirmed' => 'The confirm password field does not match the password field.'
];
}
}
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
$validator->sometimes('dob', 'valid_date', function ($input) {
return apply_regex($input->dob) === true;
});
}
如何将其添加到请求类中
我已将我的规则方法修改为以下内容:
public function rules()
{
Validator::extend('valid_date', function($attribute, $value, $parameters)
{
$pieces = explode('/', $value);
if(strpos($value, '/')===FALSE) {
return false;
} else {
if(checkdate($pieces[1], $pieces[0], $pieces[2])) {
return true;
} else {
return false;
}
}
});
Validator::sometimes('dob', 'valid_date', function($input)
{
return apply_regex($input->dob) === true;
});
return [
'first_name' => 'required',
'last_name' => 'required',
'email' => 'required|email|unique:users,email',
'dob' => 'sometimes|required|regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/|valid_date',
'mobile' => 'required',
'password' => 'required|confirmed'
];
}
但我现在在提交表单时出现以下错误:
FatalErrorException in Facade.php line 216:
Call to undefined method Illuminate\Validation\Factory::sometimes()
您只需将
dob
键添加到要返回的数组中,以及要遵循的验证规则集,包括有时
在这种情况下:
'dob' : 'sometimes|required|regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/|valid_date'
根据你的评论
我希望规则valid_date仅在regex规则返回true时运行。否则 如果日期格式不正确,则有效的\u日期规则将出错
您可以通过覆盖表单请求中的
getValidatorInstance()
函数来附加有时()
规则:
protected function getValidatorInstance(){
$validator = parent::getValidatorInstance();
$validator->sometimes('dob', 'valid_date', function($input)
{
return apply_regex($input->dob) === true;
});
return $validator;
}
在Laravel 5.4中,有一个对请求的验证器实例进行更改的方法。为此,您应该使用Validator实现方法
根据中的示例,您可以将以下内容添加到请求类中:
<?php namespace App\Http\Requests\User;
use App\Http\Requests\Request;
use Validator;
use Session;
use Auth;
use App\User;
class RegisterStep1Request extends Request {
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Set up the validation rules
*/
public function rules()
{
Validator::extend('valid_date', function($attribute, $value, $parameters)
{
$pieces = explode('/', $value);
if(strpos($value, '/')===FALSE) {
return false;
} else {
if(checkdate($pieces[1], $pieces[0], $pieces[2])) {
return true;
} else {
return false;
}
}
});
return [
'first_name' => 'required',
'last_name' => 'required',
'email' => 'required|email|unique:users,email',
'dob' => 'required|regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/|valid_date',
'mobile' => 'required',
'password' => 'required|confirmed'
];
}
public function messages()
{
return [
'first_name.required' => 'The first name field is required.',
'last_name.required' => 'The last name field is required.',
'email.required' => 'The email address field is required.',
'email.email' => 'The email address specified is not a valid email address.',
'email.unique' => 'The email address is already registered with this website.',
'dob.required' => 'The date of birth field is required.',
'dob.regex' => 'The date of birth is invalid. Please use the following format: DD/MM/YYYY.',
'dob.valid_date' => 'The date of birth is invalid. Please check and try again.',
'mobile.required' => 'The mobile number field is required.',
'password.required' => 'The password field is required.',
'password.confirmed' => 'The confirm password field does not match the password field.'
];
}
}
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
$validator->sometimes('dob', 'valid_date', function ($input) {
return apply_regex($input->dob) === true;
});
}
通过这样做,您不必担心重写内部方法。此外,这似乎是配置验证器的官方方式。我已经这样做了,但现在我得到一个错误。我编辑了我的问题,以显示我所做的事情和我所犯的错误。我认为你混淆了不同的概念。听起来你好像在尝试做自定义验证..你用错了方法。你要做的是自定义验证,所以有没有一种方法可以只在另一个规则返回true时运行该规则?是的。这就是有时使用的for@geoffs3310从我在代码中看到的情况来看,不太清楚为什么要在某个时候使用
。我想您要使用的是您的自定义规则valid\u date
我希望规则valid\u date仅在regex规则返回true时运行。否则,如果日期格式不正确,则有效的日期规则将出错。在这种情况下,最好将正则表达式regex:/[0-9]{2}\/[0-9]{2}\/[0-9]{4}/
包含在自定义规则valid\u date
closureOn Laravel 5.4.6中,然后在RouteSignatureParameters.php第25行中抛出:ReflectionException:Class App\Http\Requests\Request不存在
仍在6.6中工作。我觉得通过rules()
方法向传递闭包有时候应该是可行的。哦,好吧。这是更好的方法,也是Laravel 5.5+的正确方法,但所有这些都将在验证后调用,不是吗?OP希望添加在本例中不再调用的验证规则。这个方法似乎有助于“验证失败(或成功)时要做的事情”@Dudemullet Nope。验证后不会调用这个方法。这就是方法。