Laravel 5中的自定义验证器


Custom validator in Laravel 5

我正在将我的Laravel应用程序从4升级到5。然而,我有一个自定义验证器,我无法使用它。

在L4中,我制作了一个validators.php文件,并使用require app_path().'/validators.php';将其包含在global.php中。

我试着在L5做同样的事情。我在app/Validators/Validators.php中删除了一个验证器,并更新了我的composer.json.

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

但是,现在任何页面上都不会呈现任何内容。我做错了什么?

尝试以下操作:

  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';
]

所以以下是我添加自定义验证时所做的操作。这是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。它的初始值为false。否则你会得到一个白色页面,上面有一条"禁止"的错误消息。


  1. 我在函数rules()下添加了一个规则,它看起来像

    public function rules() {
        return [
            'activeuntil' => 'today_onwards'
        ];
    }
    

today_onwards是我的新验证。

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

  2. 我在App''Services文件夹下创建了一个名为"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方法是您放置逻辑的地方。方法的名称应该总是以"validate"开头,然后是新验证密钥的名称,该名称应该是标题大小写

另一个注意事项您的验证密钥应该用下划线和所有小写字母分隔,在本例中为"today_overage"。下划线应该放在方法名称的所有第一个大写字母之前。我希望我解释得很好。

TodayOnwards方法相当于验证名称"today_owards",

另一个例子是,如果我创建了validateOldPassword,那么您的验证密钥应该是"old_password"。

  1. 我在boot()方法中的app'Providers'AppServiceProvider.php中添加了以下代码。

    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
        }
    }
    

您不使用请求类,而是使用自己的类,它是请求类的扩展。