【发布时间】:2017-04-07 22:54:46
【问题描述】:
假设我们有以下自定义验证器:
<?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 电子邮件验证器。现在,我将只复制现有的逻辑。
如果可以做到这一点,它将为我增强其他验证方法铺平道路,所以这不仅仅是一个迂腐的问题。
【问题讨论】:
-
你总是可以把它们放在一个静态类中
-
如果您有解决方案,请详细说明
-
通过将此验证规则放在静态类(静态函数)中,您可以从任何地方调用验证函数,而无需单例或对象传递。
-
我会调查一下,谢谢
-
把它扔到野外,但是使用特征呢?
标签: laravel laravel-5.3 laravel-validation