2015-03-01 45 views
30

'da Form İsteği Doğrulaması kullanılırken Özel Doğrulama Kuralları nasıl eklenir? Laravel 5. talebinin doğrulanması için form isteği doğrulama yöntemini kullanıyorum. Form isteği doğrulama yöntemiyle kendi doğrulama kuralımı eklemek istiyorum. İstek sınıfı veriliyor aşağıda. Alan öğeleriyle özel doğrulama numeric_array eklemek istiyorum.Laravel 5

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

Benim cusotom fonksiyonu laravel5 form isteği doğrulama hakkında bu doğrulama yöntemi kullanabilirsiniz nasıl

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

aşağıda verilmiştir? Eğer sadece böyle bir Service Provider koymam gerek aslında gayet olumlu yaptığım gibi Validator::extend() kullanma

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

cevap

37

:

+0

Burada çalışmak için özel hata mesajlarını nasıl alabilirim? – Dubby

+1

@Dubby, Request sınıfınızda yeni bir metod mesajı() ekleyebilir ve özel mesaj dizisini döndürebilirsiniz, örneğin: return ['field_name.custo m_validator_name '=>' Hata mesajınız ']; –

5

Örneğin, sizin Request sınıfta bu şekilde getValidatorInstance yöntemi geçersiz gerekir

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

Sonra config/app.php listeye ekleyerek sağlayıcı kayıt:

'providers' => [ 
    // Other Service Providers 

    'App\Providers\ValidatorServiceProvider', 
], 

Artık her yerde kabul cevap küresel doğrulama kuralları için çalışır, ancak birçok kez bir forma çok özeldir belirli şartları doğrulayarak olacak

+0

Bu şekilde yapmak için gerçekten * ihtiyacın var mı? Bilindiği kadarıyla bir servis sağlayıcısındaki Validator :: extend() 'i, kuralı genel olarak kullanılabilir hale getirmek için yeterli olmalıdır. – lukasgeiter

+0

Servis sağlayıcısında kullanmak için örnek kod gönderebilir misiniz.Lütfen laravel belgelerini okuyarak bir şey bulamadım :( – gsk

+0

@ShihabudheenMuhammed İşte bir [lakolsuzluk forumundan iyi bir örnek] (https://laracasts.com/discuss/channels/general-discussion/validator-custom-rule-laravel-5/yanıtlar/7355) – lukasgeiter

19

istiyorum numericarray doğrulama kuralını kullanabilirsiniz. İşte bu durumlarda tavsiye budur (yani biraz line 75 of FormRequest.php de laravel kaynak kodundan amaçlanan gibi görünüyor): Artık

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

:

sizin istek uzatacaktır ebeveyn İsteğini bir doğrulayıcı yöntemi ekleyin bütün özel istekler aşağıdaki gibi görünecektir:

<?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!' 
     ]; 
    } 
} 
+3

Bu aslında "withValidator" adlı 5.3.23 şeklinde pişirilmiştir: https://github.com/laravel/framework/commit/bf8a36ac3df03a2c889cbc9aa535e5cf9ff48777 – brad

27

yukarıdaki cevabın doğru olsa da, Mi durumlarda bir çok Yalnızca belirli bir form isteği için özel bir doğrulama oluşturmak istiyorum. FormRequest laravel'den faydalanabilirsiniz ve doğrulama fabrikasını genişletmek için bağımlılık enjeksiyonunu kullanabilirsiniz. Bu çözümün servis sağlayıcı oluşturmadan çok daha basit olduğunu düşünüyorum.

İşte nasıl yapılabileceği. Bana eserler için Array Validation

protected $rules = [ 
     'shipping_country' => ['max:60'], 
     'items' => ['array'], 
     'items.*' => 'integer' 
]; 
3

Sen "*" Eğer bir dizinin her bir öğeyi doğrulayabilir, dizi öğelerini doğrulamak için doğrulayıcı uzatmak gerekmez bize lukasgeiter veren çözüm, ama bizim lavalentlik için bizim gibi özel geçerliliklerimizle bir sınıf yaratmamızın bir farkıyla, 5.2. * Bir sonraki örnek, ikinci tarihin nerede olduğu bir tarih aralığına bir doğrulama eklemek içindir ilk ya da daha büyük olan ilk eşittir

Uygulamada/Sağlayıcılarda ValidatorExtended'i oluşturun.Tamam. şimdi Hizmet Sağlayıcıyı oluşturmanızı sağlar. config/app.php içinde sonu ve

//Servicio para extender validaciones 
App\Providers\ValidationExtensionServiceProvider::class, 
de sağlayıcıları diziye eklemek, app/Sağlayıcıları içeride ValidationExtensionServiceProvider.php oluşturun ve biz

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

Şimdi bu Servis Sağlayıcı yüklemek için laravel söylemek kod

şimdi

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

veya Validator içinde

fonksiyon kuralları bizim isteğinizde bu doğrulama kullanabilirsiniz: yapmak

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

Doğrulamayı yapan yöntemin adının önek geçerliliğine sahip olduğunu ve deve durumda stil validateAfterOrEqual öğesinde olduğunu, ancak doğrulama kuralını kullandığınızda her büyük harfin alt çizgi ve küçük harfle değiştirildiğini fark etmeniz gerekir. mektup.

Tüm bunları https://www.sitepoint.com/data-validation-laravel-right-way-custom-validators// adresinden alıyorum. Onlara teşekkürler.

+0

OP'nin asıl başlıklı sorusu bu cevapta yanıtlanmamasına rağmen. Bu cevap, OP'nin gerçek senaryosu için çok daha iyi bir çözümdür. –

0

de görebileceğiniz gibi

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