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)
,可以确保安全。谢谢