Laravel 5中的自定义验证器

Laravel 5中的自定义验证器

问题描述:

我正在将我的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

尝试以下操作:

  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

所以这是我在添加自定义验证时所做的。这是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”错误信息的白页。


  1. 我加了一个规则的作用下rules(),这里是什么样子

    public function rules() { 
        return [ 
         'activeuntil' => 'today_onwards' 
        ]; 
    } 
    
  2. today_onwards是我的新的验证。

    1. 我创建了一个应用程序的文件夹下名为“服务”文件夹

    2. 我创建了一个下应用\服务文件夹命名为“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; 
            }   
           } 
          } 
      
    3. 注:的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类的扩展。

    开始=“3”>
开始=>
+0

对第9步抱歉无法让代码格式化工作,任何帮助表示赞赏。 – 2015-12-20 02:55:32

+0

附加说明:如果您尝试验证的字段为空,则自定义验证不起作用。 – 2015-12-20 04:08:54