it-swarm.com.ru

Laravel: проверить целочисленное поле, которое должно быть больше другого

У меня есть два поля, которые являются необязательными, только если оба отсутствуют:

$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'
]; 

Теперь end_page должен быть больше, чем initial_page. Как включить этот фильтр?

31
Alexandre Thebaldi

Существует нет встроенной проверки, которая позволила бы вам сравнивать значения полей, подобные этим в 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);
    });
  }
}

Теперь вы можете использовать новое правило проверки в ваших правилах $:

$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'
]; 

Вы найдете больше информации о создании пользовательских валидаторов здесь: http://laravel.com/docs/5.1/validation#custom-validation-rules . Их легко определить, и их можно использовать везде, где вы проверяете свои данные.

48
jedrzej.kurylo

Для Laravel 5.4 это будет:

$rules = ['end_page'=>'min:'.(int)$request->initial_page]
14
Nagibaba

Я думаю, что вы можете попробовать что-то вроде этого,

$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'
]; 
10
K.Toress

Начиная с Laravel 5.6 добавлены правила gt , gte, lt и lte.

7
Sarpdoruk Tahmaz

Почему бы просто не определить номер $min_number = $min + 1 и использовать min:$min_number валидатора, например:

$min = intval($data['min_number']) + 1;

return ['max_number'  => 'required|numeric|min:'.$min];

И затем вы можете вернуть пользовательское сообщение об ошибке, чтобы объяснить ошибку пользователю.

1
Mahmoud Ali Kassem