1

Illuminate\Validation\Validator'da doReplacements yöntemini geçersiz kılmaya çalışıyorum.Laravel 5.2 - Validator sınıfının genişletilmesi

ReflectionException in Route.php line 270:

Class App\Http\Requests\FooRequest does not exist

Bu benim yaptığım budur:

  1. yerli Illuminate\Validation\Validator uzatın:

    class MyCustomValidator extends Validator { 
    
        protected function doReplacements($message, $attribute, $rule, $parameters) { 
         //override this method 
        } 
    
    } 
    
  2. kullanın MyCustomValidator I yerli Validator ve Request sınıfları uzatmak zaman bu hatayı alıyorum doğal bir App\Http\Requests\Request:

    uzantısı
    abstract class MyCustomRequest extends Request { 
    
        //Override native method by injecting the extending validator 
        protected function formatErrors(MyCustomValidator $validator) 
        { 
         return $validator->getMessageBag()->toArray(); 
        } 
    } 
    
  3. beton sınıfı ile MyCustomRequest uzatın:

    class FooRequest extends MyCustomRequest 
    { 
    
        public function authorize() 
        { 
         return true; 
        } 
    
    
        public function rules() 
        { 
         return [ 
          // rules go here 
         ]; 
        } 
    } 
    
  4. bir kontrolör yönteminde FooRequest kullanın:

    public function store(FooRequest $request) { 
        //use the request and persist 
    } 
    


Ben tahmin ediyorum ben gerekli bir cephe eksik am , sağlayıcı veya kapsayıcı ciltleme. Hala bu konuları öğreniyorum ve iyi bir sonraki adımı bilmek için onları yeterince iyi anlamadım.

Referanslar:

  • Custom validator in Laravel 5

    - cevabı izledi ancak hala aynı hata var. Burada denediğim sorunu gidermeden önce bunun problemimle uzaktan ilişkili olup olmadığını bilmek istiyorum.

  • Extending Custom Validation-Class - Sorun cevabı ben AppServiceProvider yapılabilir biliyorum Validator::extend, kullanılmasını önerir, benzer, ama ideal olarak benim kod kendi satıcı paketinde olmalıdır. Yine, ilgili olup olmadığından emin değilim.

    public function validator(\Illuminate\Contracts\Validation\Factory $factory) 
    { 
        $this->addExtraRules($factory); 
    
        return $factory->make(
         $this->all(), $this->container->call([$this, 'rules']), 
         $this->messages(), $this->attributes() 
        ); 
    } 
    

    ve şimdi örneğin addExtraRules yöntemini uygulamak gerekir: Ne yapabilirsiniz

cevap

0

örneğin sizin Request sınıfa bu şekilde validator kural eklemek olduğunu

protected function addExtraRules(\Illuminate\Contracts\Validation\Factory $validator) 
{ 
    $validator->extendImplicit('equals_2', 
     function ($attribute, $value, $parameters, $validator) { 
      return $value == 2; 
     }); 
} 

Ve Bu hatalar hakkında: App\Http\Requests\FooRequest, FooRequest sınıf dosyasında ad alanı tanımladığınızdan emin olun:

namespace App\Http\Requests; 
+0

dışarı yorum yapabilirsiniz. Açıklama için düzenlenmiş soru – bsapaka

0

Aynı problem vardı ve yaptığım buydu. İlk olarak bir sınıf oluşturun ve CustomValidatorServiceProvider veya istediğiniz herhangi bir ad verin. Aşağıdaki satırları CustomValidatorServiceProvider ekleyin.Eğer fark olacaksa

<?php 

namespace App\Providers; 

use Illuminate\Support\Facades\Event; 
use Illuminate\Validation\ValidationServiceProvider as ServiceProvider; 
use App\Services\Validator\Factory; 

class CustomValidatorServiceProvider extends ServiceProvider 
{ 

    /** 
    * Register the validation factory. 
    * 
    * @return void 
    */ 
    protected function registerValidationFactory() 
    { 
     $this->app->singleton('validator', function ($app) { 
      $validator = new Factory($app['translator'], $app); 

      // The validation presence verifier is responsible for determining the existence 
      // of values in a given data collection, typically a relational database or 
      // other persistent data stores. And it is used to check for uniqueness. 
      if (isset($app['db']) && isset($app['validation.presence'])) { 
       $validator->setPresenceVerifier($app['validation.presence']); 
      } 

      return $validator; 
     }); 
    } 

} 

ben kendi Validator \ Fabrikası eklendi ve onu ithal. İçinde Validator \ Factory Aşağıdaki kodlarım var. Validator \ Fabrikası bulunduğu, ayrıca çerçevenin Validator Class uzanır sınıf olacak benim özel Validator Sınıf eklendi aynı dizinde İçinde
<?php 

namespace App\Services\Validator; 

use Illuminate\Validation\Factory as ParentFactory; 

class Factory extends ParentFactory 
{ 

    /** 
    * Resolve a new Validator instance. 
    * 
    * @param array $data 
    * @param array $rules 
    * @param array $messages 
    * @param array $customAttributes 
    * @return \Illuminate\Validation\Validator 
    */ 
    protected function resolve(array $data, array $rules, array $messages, array $customAttributes) 
    { 
     if (is_null($this->resolver)) { 
      return new Validator($this->translator, $data, $rules, $messages, $customAttributes); 
     } 

     return call_user_func($this->resolver, $this->translator, $data, $rules, $messages, $customAttributes); 
    } 
} 

. Aşağıdaki kodları içerir.

<?php 

namespace App\Services\Validator; 

use Illuminate\Validation\Validator as ParentValidator; 
use Illuminate\Support\Str; 

class Validator extends ParentValidator 
{ 

    /** 
    * Replace all place-holders for the greater_than_equal rule. 
    * 
    * @param string $message 
    * @param string $attribute 
    * @param string $rule 
    * @param array $parameters 
    * @return string 
    */ 
    protected function replaceGreaterThanEqual($message, $attribute, $rule, $parameters) 
    { 
     $replacers[0] = str_replace('_', ' ', Str::snake($parameters[0])); 
     $replacers[1] = $attribute; 
     return str_replace([':other', ':attribute'], $replacers, $message); 
    } 

    /** 
    * Replace all place-holders for the after_or_equal rule. 
    * 
    * @param string $message 
    * @param string $attribute 
    * @param string $rule 
    * @param array $parameters 
    * @return string 
    */ 
    protected function replaceAfterOrEqual($message, $attribute, $rule, $parameters) 
    { 
     return $this->replaceGreaterThanEqual($message, $attribute, $rule, $parameters); 
    } 
} 

Ve son olarak, biz sağlayıcıları dizinin altında yapılandırma/app.php oluşturulan Servis Sağlayıcı eklemek gerekir.

App\Providers\CustomValidatorServiceProvider::class, 

Ve zaten kaldırmak ya da ben `Validator :: doReplacements` yöntemini geçersiz çalışıyorum ValidationServiceProvider

Illuminate\Validation\ValidationServiceProvider::class,