1

我試圖覆蓋Illuminate\Validation\Validator中的doReplacements方法。當我擴展本機ValidatorRequest班,我得到這個錯誤:Laravel 5.2 - 擴展驗證程序類

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

我想重寫'驗證:: 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我有以下代碼。

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

裏面其中驗證\廠所在,我也加了我的自定義驗證類,這將是擴展框架驗證類的類相同的目錄。它包含以下代碼。

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

最後,我們應該添加服務提供商我們在配置/ app.php下創建提供商陣列。

App\Providers\CustomValidatorServiceProvider::class, 

而且你已經可以刪除或註釋掉ValidationServiceProvider

Illuminate\Validation\ValidationServiceProvider::class,