2015-02-09 124 views
7

我正在將我的Laravel應用程序從4升級到5.但是,我有一個自定義驗證器,我無法工作。Laravel 5中的自定義驗證器

在L4,我做了validators.php文件,並使用包含require app_path().'/validators.php';它在global.php

我試過在L5中做些相同的事情。我在app/Validators/Validators.php中刪除了一個驗證器,並更新了我的composer.json

"files": [ 
    "app/Validators/Validators.php" 
] 

但是,現在沒有在任何頁面上呈現。我做錯了什麼?

+0

檢查您的日誌 - 「app/storage/logs/laravel.log」和/或您的網絡服務器的日誌文件。 – ceejayoz 2015-02-09 19:49:39

+0

你運行'composer dump-autoload'嗎? – lukasgeiter 2015-02-09 21:32:09

+0

@ceejayoz失敗時不會記錄任何內容。 lukasgeiter是的,我做過 – Maeh 2015-02-10 10:54:17

回答

27

嘗試以下操作:

  1. 做一個綁定類,你可以實現每個規則,想要擴展Validator類。
  2. 製造延伸ServiceProvider的服務提供商。
  3. config/app.php文件中添加您的自定義驗證器提供程序。

您可以在Services文件夾中創建的綁定是這樣的:

namespace MyApp\Services; 

class Validator extends \Illuminate\Validation\Validator{ 

    public function validateFoo($attribute, $value, $parameters){ 
     return $value == "foo" 
    } 
} 

然後,使用服務提供商擴展了核心:

namespace MyApp\Providers; 

use MyApp\Services\Validator; 
use Illuminate\Support\ServiceProvider; 

class ValidatorServiceProvider extends ServiceProvider{ 

    public function boot() 
    { 
     \Validator::resolver(function($translator, $data, $rules, $messages) 
     { 
      return new Validator($translator, $data, $rules, $messages); 
     }); 
    } 

    public function register() 
    { 
    } 
} 

最後,在config/app.php導入您的服務提供商像這樣:

'providers' => [ 
    ... 
    ... 
    'MyApp\Providers\ValidatorServiceProvider'; 
] 
+0

工作就像一個魅力。謝謝 – Maeh 2015-02-10 11:00:11

+0

好!很高興爲您效勞 – manix 2015-02-10 14:11:15

+12

爲什麼文件不包含此內容?它確實在整個主題上有3段。 – 2015-04-15 20:36:46

4

所以這是我在添加自定義驗證時所做的。這是laravel 5.1

  1. 運行PHP Artisan make:request MyFormValidationRequest文件下app\Requests\MyFormValidationRequest.php

創建這裏的初始代碼:

<?php 

namespace App\Http\Requests; 
use App\Http\Requests\Request; 

class MyFormValidationRequest extends Request 
{ 
    /** 
    * Determine if the user is authorized to make this request. 
    * 
    * @return bool 
    */ 
    public function authorize() 
    { 
     return true; 
    } 

    /** 
    * Get the validation rules that apply to the request. 
    * 
    * @return array 
    */ 
    public function rules() 
    { 

     return [ 
      // 

     ]; 
    } 
} 

重要:更改authorize()方法的返回值如果你沒有進行任何驗證,則爲true。它的初始值是錯誤的。否則你會得到一個帶有「Forbidden」錯誤信息的白頁。


  • 我加了一個規則的作用下rules(),這裏是什麼樣子

    public function rules() { 
        return [ 
         'activeuntil' => 'today_onwards' 
        ]; 
    } 
    
  • today_onwards是我的新的驗證。

  • 我創建了一個應用程序的文件夾下名爲「服務」文件夾

  • 我創建了一個下應用\服務文件夾命名爲「ValidatorExtended.php」文件,這裏的下面的代碼:

    <?php 
    
        namespace App\Services;  
        use Illuminate\Validation\Validator; 
        use Carbon\Carbon; 
    
        class ValidatorExtended extends Validator { 
    
         private $_custom_messages = array(  
          "today_onwards" => "The :attribute must be today onwards", 
         ); 
    
         public function __construct($translator, $data, $rules, $messages = array(), $customAttributes = array()) { 
          parent::__construct($translator, $data, $rules, $messages, $customAttributes); 
    
          $this->_set_custom_stuff(); 
         } 
    
         protected function _set_custom_stuff() { 
          //setup our custom error messages 
          $this->setCustomMessages($this->_custom_messages); 
         } 
    
         protected function validateTodayOnwards($attribute, $value) {  
          $now = strtotime('-1 day'); 
          $valueDateFormat = strtotime($value); 
    
          if($valueDateFormat > $now){ 
           return true; 
          } 
          else { 
           return false; 
          }   
         } 
        } 
    
  • 注:的validateTodayOnwards方法是,你把你的邏輯。 方法的名稱應在「驗證」永遠啓動,然後你的新的驗證密鑰的名稱應該是在標題的情況下,

    另注您的驗證密鑰應該用下劃線和所有小字母分開,這種情況下,「today_onwards」。下劃線應放在方法名稱中的所有第一個大寫字母之前。我希望我解釋得很好。

    TodayOnwards方法等效於「today_onwards」驗證名稱,

    另一個例子,如果我創建validateOldPassword,您的驗證關鍵應該是「OLD_PASSWORD」。

    1. 我在app\Providers\AppServiceProvider.php的代碼裏面加了boot()的方法。

      Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array()) 
      { 
          return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes); 
      }); 
      
    2. 不要忘記添加以下庫,一個是Validator類,另一個是你自己的類,這是「ValidatorExtended」。

      use App\Services\ValidatorExtended; 
      
      use Illuminate\Support\Facades\Validator; 
      
    3. 這裏是整個文件的樣子,[app\Providers\AppServiceProvider.php]

      <?php 
      
          namespace App\Providers; 
      
          use Illuminate\Support\ServiceProvider; 
          use App\Services\ValidatorExtended; 
          use Illuminate\Support\Facades\Validator; 
      
          class AppServiceProvider extends ServiceProvider 
          { 
          /** 
          * Bootstrap any application services. 
          * 
          * @return void 
          */ 
           public function boot() 
           { 
            // 
            Validator::resolver(function($translator, $data, $rules, $messages = array(), $customAttributes = array()) 
            { 
             return new ValidatorExtended($translator, $data, $rules, $messages, $customAttributes); 
            }); 
           } 
      
           /** 
            * Register any application services. 
            * 
            * @return void 
           */ 
           public function register() 
           { 
            // 
           } 
          } 
      
    4. 就是這樣。完成。您創建了自己的自定義驗證。

    5. 此外,如果你想在你的控制器使用方法,下面是代碼:

      class testController extends Controller 
      { 
          public function updatePass(MiscValidation $request){ 
           //code here 
          } 
      } 
      

    而不是使用請求類你用你自己的類,這是Request類的擴展。

    +0

    對第9步抱歉無法讓代碼格式化工作,任何幫助表示讚賞。 – 2015-12-20 02:55:32

    +0

    附加說明:如果您嘗試驗證的字段爲空,則自定義驗證不起作用。 – 2015-12-20 04:08:54