【问题标题】:How can I re-utilise existing validation methods in my custom validation method in Laravel?如何在 Laravel 的自定义验证方法中重新利用现有的验证方法?
【发布时间】: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-&gt;validateEmail($attribute, $value) ? (do my validation) : false;.

解决这个问题的唯一方法是不要重复我自己,并搭载 Laravel 电子邮件验证器。现在,我将只复制现有的逻辑。

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

【问题讨论】:

  • 你总是可以把它们放在一个静态类中
  • 如果您有解决方案,请详细说明
  • 通过将此验证规则放在静态类(静态函数)中,您可以从任何地方调用验证函数,而无需单例或对象传递。
  • 我会调查一下,谢谢
  • 把它扔到野外,但是使用特征呢?

标签: laravel laravel-5.3 laravel-validation


【解决方案1】:

我想知道为什么不能仅将 email 规则用作规则,而不是在自定义验证中调用 Laravel 电子邮件验证函数。不需要覆盖。

例如:

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

bail 文档:

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

【讨论】:

  • 这确实是一个有效的解决方案,但在属性范围内发生的第一个错误是否也会返回保释?还是我弄错了? IE。如果没有弄错,这是一个有一些用例警告的解决方案。这也暗示email 按照标准电子邮件验证的格式验证是按照我的规则进行的,因此最好不要记住bail|email|email_and_mx_record,即使这种情况相当微不足道。感谢您迄今为止的意见
  • 我重新阅读了bail 上的文档,也许这确实是解决问题的好方法。剩下的唯一问题是重命名规则,因此并不暗示电子邮件格式也会被检查,例如只是email_mx_record,或寻找其他方式。
  • 经过深思熟虑后,我会在今晚晚些时候标记这是正确的,因为它解决了问题,但如果您知道我的意思,我不确定这是否是我想要解决的方式!
猜你喜欢
  • 2018-05-12
  • 1970-01-01
  • 2021-10-13
  • 2018-02-18
  • 1970-01-01
  • 2014-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多