wake-up-neo.com

So fügen Sie benutzerdefinierte Validierungsregeln hinzu, wenn Sie die Formularanforderungsvalidierung in Laravel 5

Ich verwende die Validierungsmethode für Formularanforderungen für die Validierung von Anforderungen in laravel 5.Ich möchte meine eigene Validierungsregel mit der Validierungsmethode für Formularanforderungen hinzufügen. Meine Anforderungsklasse wird unten angegeben. Ich möchte benutzerdefinierte hinzufügen Validierung numeric_array mit Feldelementen.

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

Meine Zollfunktion ist unten angegeben

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

Wie kann diese Validierungsmethode mit der Validierung von Formularanforderungen in laravel5 verwendet werden?

37
gsk

Wenn Sie Validator::extend() so verwenden, wie Sie es tun, ist das völlig in Ordnung. Sie müssen das einfach in ein Service Provider wie folgt einfügen:

<?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()
    {
        //
    }
}

Dann registrieren Sie den Provider, indem Sie ihn zur Liste in config/app.php Hinzufügen:

'providers' => [
    // Other Service Providers

    'App\Providers\ValidatorServiceProvider',
],

Sie können jetzt die Validierungsregel numericarray überall dort verwenden, wo Sie möchten

41
lukasgeiter

Obwohl die oben stehende Antwort korrekt ist, möchten Sie in vielen Fällen möglicherweise nur für eine bestimmte Formularanforderung eine benutzerdefinierte Validierung erstellen. Sie können laravel FormRequest verwenden und die Abhängigkeitsinjektion verwenden, um die Validierungsfactory zu erweitern. Ich denke, diese Lösung ist viel einfacher als das Erstellen eines Dienstanbieters.

So kann es gemacht werden.

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',
        ];
    }
}
39
Adrian Gunawan

Die akzeptierte Antwort gilt für globale Validierungsregeln. Oft werden Sie jedoch bestimmte Bedingungen validieren, die für ein Formular sehr spezifisch sind. Hier ist, was ich unter diesen Umständen empfehle (das scheint von Laravel Quellcode bei Zeile 75 von FormRequest.php bestimmt zu sein):

Fügen Sie dem übergeordneten Request eine Validierungsmethode hinzu. Ihre Requests werden erweitert:

<?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;
    }
}

Jetzt sehen alle Ihre spezifischen Anfragen so aus:

<?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
prograhammer

Sie müssen die getValidatorInstance -Methode in Ihrer Request -Klasse wie folgt überschreiben:

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

Benutzerdefiniertes Regelobjekt

Eine Möglichkeit hierfür ist die Verwendung von Benutzerdefiniertes Regelobjekt . Auf diese Weise können Sie so viele Regeln definieren, wie Sie möchten, ohne Änderungen in Providern und in Controllern/Diensten vornehmen zu müssen, um neue Regeln festzulegen.

php artisan make:rule NumericArray

In 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...';
  }
}

Dann in Form Anfrage haben

use App\Rules\NumericArray;
.
.
protected $rules = [
      'shipping_country' => ['max:60'],
      'items' => ['array', new NumericArray]
];
4
gk.

Sie müssen den Validator nicht erweitern, um Array-Elemente zu validieren. Sie können jedes Element eines Arrays mit einem "*" validieren, wie in Array-Validierung dargestellt

protected $rules = [
      'shipping_country' => ['max:60'],
      'items' => ['array'],
      'items.*' => 'integer'
];
3
Félix Díaz

Für mich funktioniert die Lösung, die uns lukasgeiter gibt, aber mit dem Unterschied, dass wir mit unseren benutzerdefinierten Validierungen eine Klasse erstellen, wie diese für laravel 5.2. * Das nächste Beispiel ist das Hinzufügen einer Validierung zu Ein Datumsbereich, in dem das zweite Datum gleich oder größer als das erste Datum sein muss

In App/Providers erstellen Sie ValidatorExtended.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

Okay. Jetzt können Sie den Dienstanbieter erstellen. Erstellen Sie ValidationExtensionServiceProvider.php in app/Providers und wir codieren

<?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

Jetzt sagen wir Laravel um diesen Service Provider zu laden, fügen Sie zum Provider Array am Ende in config/app.php und

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

jetzt können wir diese Validierung in unserer Anfrage in Funktionsregeln verwenden

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

oder im Validator: make

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

sie müssen beachten, dass der Name der Methode, die die Validierung durchführt, das Präfix validate hat und im Camel-Case-Stil validateAfterOrEqual lautet. Wenn Sie jedoch die Validierungsregel anwenden, wird jeder Großbuchstabe durch einen Unterstrich und der Buchstabe in Kleinbuchstaben ersetzt.

All dies entnehme ich https://www.sitepoint.com/data-validation-laravel-right-way-custom-validators// hier im Detail erklären. dank ihnen.

0
Carolina