1

Я пытаюсь переопределить метод doReplacements в Illuminate\Validation\Validator. Когда я расширяю родные Validator и Request классов, я получаю эту ошибку:Laravel 5.2 - расширение класса Validator

ReflectionException in Route.php line 270:

Class App\Http\Requests\FooRequest does not exist

Это то, что я сделал:

  1. Расширение родной Illuminate\Validation\Validator:

    class MyCustomValidator extends Validator { 
    
        protected function doReplacements($message, $attribute, $rule, $parameters) { 
         //override this method 
        } 
    
    } 
    
  2. Использование MyCustomValidator в абстрактное расширение родного 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. Продлить MyCustomRequest с конкретным классом:

    class FooRequest extends MyCustomRequest 
    { 
    
        public function authorize() 
        { 
         return true; 
        } 
    
    
        public function rules() 
        { 
         return [ 
          // rules go here 
         ]; 
        } 
    } 
    
  4. Используйте FooRequest в методе контроллера:

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


Я предполагаю, я отсутствую необходимый фасад , провайдера или контейнера. Я все еще изучаю эти темы и не понимаю их достаточно хорошо, чтобы знать хороший следующий шаг.

Ссылки:

  • Custom validator in Laravel 5 - Я последовал ответ, но все-таки получил ту же ошибку. Я хочу знать, если это даже отдаленно связано с моей проблемой, прежде чем устранять проблемы, которые я здесь пробовал.

  • Extending Custom Validation-Class - Проблема выглядит так же, ответ предполагает использование Validator::extend, который я знаю, может быть сделано в AppServiceProvider, но в идеале мой код должен быть в своем собственном пакете поставщика. Опять же, не уверен, если уместно.

ответ

0

Что вы можете сделать, это добавить validator правило в ваш Request класса, например, таким образом:

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

и теперь вам нужно реализовать addExtraRules метод, например:

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

И об ошибках: App\Http\Requests\FooRequest, убедитесь, что вы определили пространство имен в файле FooRequest таким образом:

namespace App\Http\Requests; 
+0

Я пытаюсь переопределить 'Validator :: метод doReplacements'. Отредактированный вопрос для уточнения – bsapaka

0

У меня была такая же проблема, и это то, что я сделал.

Сначала создайте класс и назовите его CustomValidatorServiceProvider или что угодно. Внутри CustomValidatorServiceProvider добавьте следующие строки.

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

} 

Если вы заметите, что я добавил свой собственный Validator \ Factory и импортировать его. Внутри Validator \ Factory У меня есть следующие коды.

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

Внутри той же директории, где Validator \ Factory проживает, я добавил также мой обычай Validator класса который будет класс, который расширяет Validator класса в рамках. Он содержит следующие коды.

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

И, наконец, мы должны добавить Service Provider, который мы создали в конфигурации/app.php под поставщиков массива.

App\Providers\CustomValidatorServiceProvider::class, 

И вы уже можете удалить или закомментировать ValidationServiceProvider

Illuminate\Validation\ValidationServiceProvider::class, 

 Смежные вопросы

  • Нет связанных вопросов^_^