Php Laravel:验证需要大于另一个的整数字段
我有两个字段,只有当两个字段都不存在时才是可选的:Php Laravel:验证需要大于另一个的整数字段,php,laravel,laravel-5,Php,Laravel,Laravel 5,我有两个字段,只有当两个字段都不存在时才是可选的: $rules = [ 'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5', 'end_page' => 'required_with:initial_page|integer|min:2|digits_between:1,5' ]; 现在,结束页面需要大于初始页面。如何包括这个过滤器?我想你可以试试这样的东西 $init
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|min:2|digits_between:1,5'
];
现在,
结束页面
需要大于初始页面
。如何包括这个过滤器?我想你可以试试这样的东西
$init_page = Input::get('initial_page');
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|min:'. ($init_page+1) .'|digits_between:1,5'
];
没有内置验证,可以让您比较类似于Laravel中的字段值,因此您需要实现一个自定义验证程序,它可以让您在需要时重用验证。幸运的是,Laravel使编写自定义验证器变得非常容易 首先在yorAppServiceProvider中定义新的验证器:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::extend('greater_than_field', function($attribute, $value, $parameters, $validator) {
$min_field = $parameters[0];
$data = $validator->getData();
$min_value = $data[$min_field];
return $value > $min_value;
});
Validator::replacer('greater_than_field', function($message, $attribute, $rule, $parameters) {
return str_replace(':field', $parameters[0], $message);
});
}
}
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|greater_than_field:initial_page|digits_between:1,5'
];
现在,您可以在$rules中使用全新的验证规则:
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Validator::extend('greater_than_field', function($attribute, $value, $parameters, $validator) {
$min_field = $parameters[0];
$data = $validator->getData();
$min_value = $data[$min_field];
return $value > $min_value;
});
Validator::replacer('greater_than_field', function($message, $attribute, $rule, $parameters) {
return str_replace(':field', $parameters[0], $message);
});
}
}
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|greater_than_field:initial_page|digits_between:1,5'
];
您将在此处找到有关创建自定义验证器的更多信息:。它们易于定义,然后可以在验证数据的任何地方使用。对于Laravel 5.4,它将是:
$rules = ['end_page'=>'min:'.(int)$request->initial_page]
为什么不定义
$min\u number=$min+1
number并使用验证器min:$min\u number
,例如:
$min = intval($data['min_number']) + 1;
return ['max_number' => 'required|numeric|min:'.$min];
然后,您可以返回自定义错误消息,向用户解释错误。从Laravel 5.6开始,
gte
,lt
和lte
规则被添加。这个问题是在2015年提出的,因此大部分答案在2019年也过时了
我想给出一个答案,它使用了laravel团队提供的功能,包括在它的新版本中
如@Sarpadoruk所述,从laravel 5.6开始,laravel在验证中添加了如下功能
gt
,gte
,lt
和lte
,这意味着:
-大于gt
-大于等于gte
-小于lt
-小于等于lte
gt
您可以检查结束页面是否大于初始页面,您的任务现在变得非常简单:
$rules = [
'initial_page' => 'required_with:end_page|integer|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|integer|gt:initial_page|digits_between:1,5'
];
如果您在Laravel 5.2上维护一个项目,那么以下内容应该为您支持当前的gt规则:
类AppServiceProvider扩展了ServiceProvider
{
公共函数boot()
{
验证器::扩展('gt',函数($attribute,$value,$parameters,$Validator){
$min_字段=$parameters[0];
$data=$validator->getData();
$min_值=$data[$min_字段];
返回$value>$min_值;
});
验证器::替换器('gt',函数($message、$attribute、$rule、$parameters){
返回sprintf('%s必须大于%s',$attribute,$parameters[0]);
});
}
}
然后,您可以按照当前文档使用它:
$rules=[
“结束页面”=>“gt:初始页面”
];
使用gt=grather-than:value |字段
使用gte=大于等于:值|字段
使用lt=小于:值|字段
使用lte=小于等于:值|字段
你的情况是
gt:initial_page
结果将是
$rules = array(
'initial_page' => 'required_with:end_page|numeric|min:1|digits_between: 1,5',
'end_page' => 'required_with:initial_page|numeric|gt:initial_page|min:2|digits_between:1,5'
);
我的规则在我的模型类中,我不想访问其中的这个变量,但是谢谢:-)谢谢,我实现了如你所说的,并试图编辑我的
en/validation.php
,其中包含以下消息“大于字段”=>“字段\”:属性\“必须大于\”:字段\”,
在自定义验证语言行中
但我不知道要用什么替换:字段
。我更新了答案-您需要定义替换程序,用正确的值替换消息占位符。我没有测试过,我只是从医生那里拿的。让我知道它是否有效:)与此同时,我改变了我的表单,对字段名使用数组语法,比如category[id]
,而不是只使用id
。当我尝试使用“category.secondnumber”=>“大于”字段:category.firstnumber“
时,我得到错误:未定义索引:category.firstnumber
。在之后使用这个语法是可行的,所以我猜语法是正确的,但是验证器不完整。提前谢谢。解决这个问题后,我将实现replacer并报告。@Sliq,@4ndro1d:它在L5.2中运行得很好。我在App\Providers\CustomValidationServiceProvider.php
上创建了自己的提供者,并将其注册到config\App.php
上:App\Providers\CustomValidationServiceProvider::class,
否则,我只是将他的答案复制并粘贴到boot()
功能正常,工作正常。有人知道:现场更换零件吗?上面的代码确实将:field替换为我的字段名,但我需要“友好”字段名。即使替换字段名在validation.php的attributes数组中,它仍然没有被使用。正如@sobhan所建议的,$this
可能会起作用,但重要的是它很大程度上取决于上下文。例如,$this
在表单请求中作为请求
实例提供。对于控制器,您必须按照前面的回答和评论中所述直接访问请求。像这样重新注入一部分不受信任的输入真的可以吗?这看起来像是对各种漏洞的潜在邀请…@user1643723没错。在请求之前添加(int)
,可以确保安全。谢谢