【问题标题】:Custom validator in Laravel 5Laravel 5 中的自定义验证器
【发布时间】:2015-04-09 16:14:51
【问题描述】:

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

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

【问题讨论】:

  • 检查您的日志 - app/storage/logs/laravel.log 和/或您的网络服务器的日志文件。
  • 你跑composer dump-autoload了吗?
  • @ceejayoz 失败时不会记录任何内容。 lukasgeiter 是的,我做到了

标签: php validation laravel laravel-5


【解决方案1】:

尝试以下方法:

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

【讨论】:

  • 工作就像一个魅力。谢谢
  • 好!很高兴为您提供帮助
  • 为什么文档没有涵盖这个?!它实际上有 3 段关于整个主题。
  • @manix 我希望我早点看到这个。我刚刚在此问题上发布了一个类似(但不同)的答案:stackoverflow.com/questions/26817045#30971705 我必须展示如何使用其他输入,所以我想这是值得的。
  • 只需花 2 天时间在这个 **** 上,而用原生 PHP 编写它需要几秒钟......该死,Laravel!
【解决方案2】:

这就是我在添加自定义验证时所做的。这是针对 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。它的初始值为假。否则你会得到一个带有“禁止”错误消息的白页。


  1. 我在函数rules()下添加了一条规则,如下所示

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

today_onwards 是我的新验证。

  1. 我在 App 文件夹下创建了一个名为“Services”的文件夹

  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_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. 不要忘记添加下面的库,一个是验证器类,另一个是你自己的类,即“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
        }
    }
    

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

【讨论】:

  • 抱歉,第 9 步无法使代码格式化工作,感谢您的帮助。
  • 附加说明:如果您尝试验证的字段为空,则自定义验证不起作用。
猜你喜欢
  • 2015-05-10
  • 2015-01-26
  • 1970-01-01
  • 1970-01-01
  • 2016-09-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
相关资源
最近更新 更多