web-dev-qa-db-fra.com

Laravel: valider un champ entier qui doit être supérieur à un autre

J'ai deux champs qui sont facultatifs que si les deux ne sont pas présents:

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

Maintenant, end_page doit être supérieur à initial_page. Comment inclure ce filtre?

31
Alexandre Thebaldi

Il y a pas de validation intégrée qui vous permettrait de comparer les valeurs de champs de cette manière dans Laravel, vous devrez donc implémenter un validateur personnalisévous permettent de réutiliser la validation si nécessaire. Heureusement, Laravel rend l’écriture d’un validateur personnalisé très facile.

Commencez par définir un nouveau validateur dans 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);
    });
  }
}

Vous pouvez maintenant utiliser votre nouvelle règle de validation dans votre $ rules} _:

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

Vous trouverez plus d'informations sur la création de validateurs personnalisés ici: http://laravel.com/docs/5.1/validation#custom-validation-rules . Ils sont faciles à définir et peuvent ensuite être utilisés partout où vous validez vos données.

48
jedrzej.kurylo

Pour Laravel 5.4 ce sera:

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

Je pense que vous pouvez essayer quelque chose comme ça,

$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

A partir de Laravel 5.6, les règles gt , gte, lt et lte sont ajoutées.

7
Sarpdoruk Tahmaz

Pourquoi ne pas simplement définir le numéro $min_number = $min + 1 et utiliser le validateur min:$min_number, exemple:

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

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

Et vous pouvez ensuite renvoyer un message d'erreur personnalisé pour expliquer l'erreur à l'utilisateur.

1
Mahmoud Ali Kassem