1

Ich versuche, die doReplacements Methode in Illuminate\Validation\Validator zu überschreiben. Als ich die nativen Validator und Request Klassen erweitern, bekomme ich diesen Fehler:Laravel 5.2 - Erweiterung der Validator-Klasse

ReflectionException in Route.php line 270:

Class App\Http\Requests\FooRequest does not exist

Das ist, was ich tat:

  1. Extend nativen Illuminate\Validation\Validator:

    class MyCustomValidator extends Validator { 
    
        protected function doReplacements($message, $attribute, $rule, $parameters) { 
         //override this method 
        } 
    
    } 
    
  2. Verwendung MyCustomValidator in eine abstrakte Erweiterung von nativen App\Http\Requests\Request:

    abstract class MyCustomRequest extends Request { 
    
        //Override native method by injecting the extending validator 
        protected function formatErrors(MyCustomValidator $validator) 
        { 
         return $validator->getMessageBag()->toArray(); 
        } 
    } 
    
  3. Extend MyCustomRequest mit Betonklasse:

    class FooRequest extends MyCustomRequest 
    { 
    
        public function authorize() 
        { 
         return true; 
        } 
    
    
        public function rules() 
        { 
         return [ 
          // rules go here 
         ]; 
        } 
    } 
    
  4. die FooRequest in einer Controller-Methode verwenden:

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


ich ich bin zu raten, eine erforderliche Fassade bin fehlt , Anbieter oder Containerbindung. Ich lerne immer noch diese Themen und verstehe sie nicht gut genug, um einen guten nächsten Schritt zu erfahren.

Referenzen:

  • Custom validator in Laravel 5 - folgte ich die Antwort, aber immer noch die gleichen Fehler. Ich möchte wissen, ob dies auch nur im Entferntesten mit meinem Problem zusammenhängt, bevor ich versuche, was ich hier versucht habe.

  • Extending Custom Validation-Class - Problem sieht ähnlich aus, Antwort schlägt Validator::extend verwenden, die ich kenne, kann in AppServiceProvider, aber idealerweise sollte meinen Code sein in seinem eigenen Lieferanten Paket erfolgen. Nochmal nicht sicher, ob relevant.

Antwort

0

Was Sie tun können, validator Regel in Ihre Request Klasse zum Beispiel fügen diese Weise:

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

und jetzt müssen Sie addExtraRules Verfahren zum Beispiel implementieren:

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

Und Über diesen Fehler: App\Http\Requests\FooRequest, stellen Sie sicher, dass Sie den Namespace in FooRequest Klassendatei auf diese Weise definiert haben:

namespace App\Http\Requests; 
+0

ich die 'Validator :: doReplacements' Methode außer Kraft zu setzen versuchen. Bearbeitete Frage zur Klärung – bsapaka

0

Ich hatte das gleiche Problem und das ist, was ich getan habe.

Zuerst erstellen Sie eine Klasse und benennen Sie sie CustomValidatorServiceProvider oder alles was Sie wollen. Inside CustomValidatorServiceProvider fügen Sie die folgenden Zeilen hinzu.

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

} 

Wenn Sie feststellen, fügte ich meine eigene Validator \ Fabrik und es importiert. Innerhalb von Validator \ Factory Ich habe die folgenden Codes.

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

Innerhalb des gleichen Verzeichnis, in dem Validator \ Fabrik wohnt, habe ich auch Validator Klasse meine Gewohnheit hinzugefügt, die die Klasse sein wird, der die Validator Klasse der Rahmen erstreckt. Es enthält die folgenden Codes.

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

Und schließlich sollten wir den Service Provider hinzufügen, die wir in config/app.php unter Anbietern Array erstellt.

App\Providers\CustomValidatorServiceProvider::class, 

Und Sie können bereits entfernen oder kommentieren Sie den ValidationServiceProvider

Illuminate\Validation\ValidationServiceProvider::class,