Laravel:验证需要大于另一个的整数字段

Ale*_*ldi 34 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'
]; 
Run Code Online (Sandbox Code Playgroud)

现在,end_page需要大于initial_page.如何包含此过滤器?

jed*_*ylo 52

没有内置的验证,它可以让你比较字段值一样,在Laravel,所以你需要实现一个自定义的验证,这将让你在需要的地方重用验证.幸运的是,Laravel使编写自定义验证器非常容易.

首先在yor AppServiceProvider中定义新的验证器:

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);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以在$规则中使用全新的验证规则:

$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'
]; 
Run Code Online (Sandbox Code Playgroud)

您可以在此处找到有关创建自定义验证器的更多信息:http://laravel.com/docs/5.1/validation#custom-validation-rules.它们很容易定义,然后可以在验证数据的任何地方使用.


Har*_*hil 37

这个问题是在 2015 年提出的,所以大部分答案现在在 2019 年也已经过时了

我想给出的答案使用了 laravel 团队提供的功能,这些功能包含在新版本中,

因此通过作为@Sarpadoruk表述为laravel在验证5.6 laravel添加的功能,如 gtgteltlte该装置:

  • gt - 比...更棒
  • gte - 大于等于
  • lt - 少于
  • lte - 小于等于

所以使用gt你可以检查你的 end_page 应该大于你的 initial_page 并且你的任务现在变得非常简单:

$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'
]; 
Run Code Online (Sandbox Code Playgroud)


Nag*_*aba 19

对于Laravel 5.4,它将是:

$rules = ['end_page'=>'min:'.(int)$request->initial_page]
Run Code Online (Sandbox Code Playgroud)

  • 像这样重新注入一部分不受信任的输入**真的没问题吗?这看起来像是对各种漏洞的潜在邀请...... (4认同)
  • 正如@sobhan建议的那样,'$ this`可能有用,但重要的是要提到它取决于上下文.例如`$ this`在表单请求中可用作`Request`实例.对于控制器,您必须直接访问请求,如之前的答案和评论中所述. (3认同)

Sar*_*maz 14

由于Laravel 5.6 gt,gte,ltlte添加规则.


K.T*_*ess 12

我想你可以尝试这样的事情,

$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'
]; 
Run Code Online (Sandbox Code Playgroud)


小智 5

使用 gt = 大于:值|字段

使用 gte = 大于等于:值|字段

使用 lt = 小于:值|字段

使用lte =小于等于:值|字段

在你的情况下是:

gt:initial_page
Run Code Online (Sandbox Code Playgroud)

结果将是:

$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'
      );
Run Code Online (Sandbox Code Playgroud)