2015-02-09 236 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