如何在Laravel中的自定义验证方法中重用现有的验证方法?

时间:2017-04-07 10:52:00

标签: laravel laravel-5.3 laravel-validation

我们说我们有以下自定义验证器:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Validator;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('email_and_mx_record', function ($attribute, $value, $parameters, $validator) {
            //...
        });
    }

    /**
     * Register the service provider.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

正如验证名称所暗示的,我想创建电子邮件地址的MX记录验证。首先,首先,检查电子邮件地址格式是有效的。现在我知道这很简单,如果我只是复制使用一个众所周知的函数的Validator类本身的现有验证逻辑:

<?php

namespace Illuminate\Validation;

class Validator implements ValidatorContract
{
    /**
     * Validate that an attribute is a valid e-mail address.
     *
     * @param  string  $attribute
     * @param  mixed   $value
     * @return bool
     */
    protected function validateEmail($attribute, $value)
    {
        return filter_var($value, FILTER_VALIDATE_EMAIL) !== false;
    }
}

但在理想的世界里,我想坚持DRY原则。

我想知道是否有办法在我的自定义验证器中调用此方法?例如。 (不起作用):return $validator->validateEmail($attribute, $value) ? (do my validation) : false;

这个问题的唯一解决方案是不重复自己的方式,并捎带在Laravel电子邮件验证器上。现在,我将复制现有的逻辑。

如果可以这样做,它将为我增强其他验证方法铺平道路,因此它不仅仅是一个迂腐的问题。

1 个答案:

答案 0 :(得分:1)

我不知道在您的自定义验证中调用Laravel电子邮件验证功能,我想知道为什么您不能仅使用email规则。没有必要覆盖。

例如:

$this->validate($request, [ 'email' => 'bail|email|email_and_mx_record', ... ]);

bail文档:

  

有时您可能希望停止运行验证规则   第一次验证失败后的属性。为此,请指定   保释规则属性: