我们说我们有以下自定义验证器:
<?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电子邮件验证器上。现在,我将复制现有的逻辑。
如果可以这样做,它将为我增强其他验证方法铺平道路,因此它不仅仅是一个迂腐的问题。
答案 0 :(得分:1)
我不知道在您的自定义验证中调用Laravel电子邮件验证功能,我想知道为什么您不能仅使用email
规则。没有必要覆盖。
例如:
$this->validate($request, [
'email' => 'bail|email|email_and_mx_record',
...
]);
bail
文档:
有时您可能希望停止运行验证规则 第一次验证失败后的属性。为此,请指定 保释规则属性: