Comment ajouter des règles de Validation personnalisées lors de L'utilisation de la Validation de la demande de formulaire dans Laravel 5

j'utilise la méthode form request validation pour valider la requête dans laravel 5.J'aimerais ajouter ma propre règle de validation avec la méthode de validation de la demande de formulaire.Ma classe de demande est donnée ci-dessous.Je veux ajouter une validation personnalisée numeric_array avec des éléments de champ.

  protected $rules = [
      'shipping_country' => ['max:60'],
      'items' => ['array|numericarray']
];

Mon cusotom fonction est donnée ci-dessous

 Validator::extend('numericarray', function($attribute, $value, $parameters) {
            foreach ($value as $v) {
                if (!is_int($v)) {
                    return false;
                }
            }
            return true;
        });

comment utiliser cette méthode de validation avec à propos de la validation de la demande de formulaire dans laravel5?

32
demandé sur prograhammer 2015-03-01 15:48:46

7 réponses

en utilisant Validator::extend() comme vous le faites est en fait parfaitement bien, vous avez juste besoin de mettre ça dans un Fournisseur De Services comme ceci:

<?php namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class ValidatorServiceProvider extends ServiceProvider {

    public function boot()
    {
        $this->app['validator']->extend('numericarray', function ($attribute, $value, $parameters)
        {
            foreach ($value as $v) {
                if (!is_int($v)) {
                    return false;
                }
            }
            return true;
        });
    }

    public function register()
    {
        //
    }
}

Puis inscrire le fournisseur, en l'ajoutant à la liste config/app.php:

'providers' => [
    // Other Service Providers

    'App\Providers\ValidatorServiceProvider',
],

Vous pouvez maintenant utiliser la numericarray règle de validation partout où vous voulez

39
répondu lukasgeiter 2015-03-01 14:43:42

Alors que la réponse ci-dessus est correcte, dans beaucoup de cas, vous souhaiterez peut-être créer une validation personnalisée pour une demande de formulaire. Vous pouvez utiliser laravel FormRequest et utiliser l'injection de dépendances pour étendre l'usine de validation. Je pense que cette solution est beaucoup plus simple que de créer un fournisseur de services.

Voici comment faire.

use Illuminate\Validation\Factory as ValidationFactory;

class UpdateMyUserRequest extends FormRequest {

    public function __construct(ValidationFactory $validationFactory)
    {

        $validationFactory->extend(
            'foo',
            function ($attribute, $value, $parameters) {
                return 'foo' === $value;
            },
            'Sorry, it failed foo validation!'
        );

    }

    public function rules()
    {
        return [
            'username' => 'foo',
        ];
    }
}
32
répondu Adrian Gunawan 2015-07-14 23:01:27

la réponse acceptée fonctionne pour les règles de validation globale, mais souvent vous validerez certaines conditions qui sont très spécifiques à un formulaire. Voici ce que je recommande dans ces circonstances (qui semble être un peu voulu à partir du code source Laravel à ligne 75 du formulaire de demande.php):

ajouter une méthode de validateur à la requête mère vos requêtes vont s'étendre:

<?php namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Validator;

abstract class Request extends FormRequest {

    public function validator(){

        $v = Validator::make($this->input(), $this->rules(), $this->messages(), $this->attributes());

        if(method_exists($this, 'moreValidation')){
            $this->moreValidation($v);
        }

        return $v;
    }
}

maintenant toutes vos requêtes spécifiques ressembleront à ceci:

<?php namespace App\Http\Requests;

use App\Http\Requests\Request;

class ShipRequest extends Request {

    public function rules()
    {
        return [
            'shipping_country' => 'max:60',
            'items' => 'array'
        ];
    }

    // Here we can do more with the validation instance...
    public function moreValidation($validator){

        // Use an "after validation hook" (see laravel docs)
        $validator->after(function($validator)
        {
            // Check to see if valid numeric array
            foreach ($this->input('items') as $item) {
                if (!is_int($item)) {
                    $validator->errors()->add('items', 'Items should all be numeric');
                    break;
                }
            }
        });
    }

    // Bonus: I also like to take care of any custom messages here
    public function messages(){
        return [
            'shipping_country.max' => 'Whoa! Easy there on shipping char. count!'
        ];
    }
}
19
répondu prograhammer 2015-04-29 13:16:50

Vous devez remplacer getValidatorInstance dans votre Request classe, par exemple de cette façon:

protected function getValidatorInstance()
{
    $validator = parent::getValidatorInstance();
    $validator->addImplicitExtension('numericarray', function($attribute, $value, $parameters) {
        foreach ($value as $v) {
            if (!is_int($v)) {
                return false;
            }
        }
        return true;
    });

    return $validator;
}
5
répondu Marcin Nabiałek 2015-03-01 13:01:35

Vous n'avez pas besoin d'étendre le validateur pour valider les éléments du tableau, vous pouvez valider chaque élément d'un tableau avec " * " comme vous pouvez le voir dans Validation Du Tableau

protected $rules = [
      'shipping_country' => ['max:60'],
      'items' => ['array'],
      'items.*' => 'integer'
];
3
répondu Félix Díaz 2016-08-29 16:11:32

pour moi fonctionne la solution qui nous donne lukasgeiter ,mais avec une différence que nous créons une classe avec nos validations personnalisées, comme ceci, pour laravel 5.2.* L'exemple suivant est pour ajouter une validation pour une plage de date dans la deuxième date doit être égal ou plus grand que le premier

dans les fournisseurs d'app/créer Validatorextend.php

<?php
namespace App\Providers;
use Illuminate\Validation\Validator as IlluminateValidator;

class ValidatorExtended extends IlluminateValidator {

private $_custom_messages = array(
 "after_or_equal" => ":attribute debe ser una fecha posterior o igual a 
 :date.",
);

public function __construct( $translator, $data, $rules, $messages = array(),      
$customAttributes = array() ) {
  parent::__construct( $translator, $data, $rules, $messages, 
  $customAttributes );
  $this->_set_custom_stuff();
}

protected function _set_custom_stuff() {
   //setup our custom error messages
  $this->setCustomMessages( $this->_custom_messages );
}

/**
 * La fecha final debe ser mayor o igual a la fecha inicial
 *
 * after_or_equal
 */
protected function validateAfterOrEqual( $attribute, $value, $parameters, 
$validator) {
   return strtotime($validator->getData()[$parameters[0]]) <= 
  strtotime($value);
}

}   //end of class

Ok. maintenant, créons le fournisseur de services. Créer ValidationExtensionServiceProvider.php à l'intérieur des applications / fournisseurs, et nous le code

<?php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Validator;

class ValidationExtensionServiceProvider extends ServiceProvider {

public function register() {}

public function boot() {
  $this->app->validator->resolver( function( $translator, $data, $rules, 
  $messages = array(), $customAttributes = array() ) {
    return new ValidatorExtended( $translator, $data, $rules, $messages, 
    $customAttributes );
} );
}

}   //end of class

maintenant nous devons dire à Laravel de charger ce fournisseur de Services, ajouter au tableau des fournisseurs à la fin dans config/app.php et

//Servicio para extender validaciones
App\Providers\ValidationExtensionServiceProvider::class,

maintenant, nous pouvons utiliser cette validation dans notre demande en fonction des règles

public function rules()
{
  return [
    'fDesde'     => 'date',
    'fHasta'     => 'date|after_or_equal:fDesde'
 ];
}

ou dans Validator:faire

$validator = Validator::make($request->all(), [
    'fDesde'     => 'date',
    'fHasta'     => 'date|after_or_equal:fDesde'
], $messages);

vous devez noter que le nom de la méthode qui fait la validation a le préfixe valider et est dans le style cas de camel validateAfterOrEqual mais quand vous utilisez la règle de validation chaque lettre majuscule est remplacée par un trait de soulignement et la lettre en minuscules.

Tout cela je le prends https://www.sitepoint.com/data-validation-laravel-right-way-custom-validators// ici d'expliquer dans les détails. grâce à eux.

0
répondu Carolina 2017-09-17 13:30:36

Règle Personnalisée Objet

une façon de le faire est d'utiliser Règle Personnalisée Objet, de cette façon vous pouvez définir autant de règles que vous voulez sans avoir besoin de faire des changements dans les fournisseurs et dans le contrôleur/service pour définir de nouvelles règles.

php artisan make:rule NumericArray

En NumericArray.php

namespace App\Rules;
class NumericArray implements Rule
{
   public function passes($attribute, $value)
   {
     foreach ($value as $v) {
       if (!is_int($v)) {
         return false;
       }
     }
     return true;
   }


  public function message()
  {
     return 'error message...';
  }
}

Ensuite, dans le Formulaire de la demande

use App\Rules\NumericArray;
.
.
protected $rules = [
      'shipping_country' => ['max:60'],
      'items' => ['array', new NumericArray]
];
0
répondu Ganesh Karki 2018-04-11 07:11:03