通过电子邮件验证电子邮件 :rfc, dns 的 Laravel faker 电子邮件

标签 laravel laravel-8

我明白了

invalid email address

当使用 faker 填充我的应用程序的电子邮件字段时。

'email' => ['required', 'email:rfc,dns']

有没有办法让 faker 吐出通过这些测试的有效电子邮件地址?

我尝试了 safeEmail 和其他一些,但它们仍然失败

最佳答案

我有同样的问题,它都与 Laravel 用来验证电子邮件的 Egulias\EmailValidator\Validation\DNSCheckValidation 类有关(如您所见 here example 是保留的顶级域)。

无法避免使用 faker 创建的电子邮件通过此验证,IMO,这是应该的。但是我们需要进行测试,不是吗?

有一个简单的方法(也可以在 FormRequest 或任何你正在使用的实现验证器的方法中使用):

// In your test:
$this->post('my-url', ['email' => $this->faker->unique()->safeEmail])

// In your code
$emailRules = 'email:rfc';

if(!app()->runningUnitTests()) {
    $emailRules .= ',dns';
}

$validator = Validator::make($data, ['email' => ['required', $emailRules]]);
// [...]

另一种方法是创建一个自定义的电子邮件验证规则来封装 runningUnitTests 逻辑(我认为它更简洁)

<?php

namespace App\Rules;

use Egulias\EmailValidator\EmailValidator;
use Egulias\EmailValidator\Validation\DNSCheckValidation;
use Egulias\EmailValidator\Validation\MultipleValidationWithAnd;
use Egulias\EmailValidator\Validation\NoRFCWarningsValidation;
use Egulias\EmailValidator\Validation\RFCValidation;
use Egulias\EmailValidator\Validation\SpoofCheckValidation;
use Illuminate\Contracts\Validation\Rule;
use Illuminate\Validation\Concerns\FilterEmailValidation;

/** @codeCoverageIgnore */
class ValidEmail implements Rule
{
    protected array $parameters;

    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct(array $parameters = [])
    {
        $this->parameters = $parameters;
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        if (! is_string($value) && ! (is_object($value) && method_exists($value, '__toString'))) {
            return false;
        }

        $validations = collect($this->parameters)
            ->unique()
            ->map(function ($validation) {
                if ($validation === 'rfc') {
                    return new RFCValidation();
                } elseif ($validation === 'strict') {
                    return new NoRFCWarningsValidation();
                } elseif ($validation === 'dns' && !app()->runningUnitTests()) {
                    return new DNSCheckValidation();
                } elseif ($validation === 'spoof') {
                    return new SpoofCheckValidation();
                } elseif ($validation === 'filter') {
                    return new FilterEmailValidation();
                }

                return null;
            })
            ->values()
            ->filter()
            ->all() ?: [new RFCValidation()];

        return (new EmailValidator)->isValid($value, new MultipleValidationWithAnd($validations));
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return __('validation.email');
    }
}

比在你的代码中:


$validator = Validator::make($data, ['email' => ['required', new ValidEmail()]]);

// OR

$validator = Validator::make($data, ['email' => ['required', new ValidEmail(['rfc','filter','dns'])]]);
// [...]

关于通过电子邮件验证电子邮件 :rfc, dns 的 Laravel faker 电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69986346/

相关文章:

laravel-8 - 我可以将 LaravelCollective/html 用于 Laravel 8 应用程序吗?

laravel 8 外键

php - 在 null 上调用成员函数 comments()

laravel - Laravel Eloquent 多个WHERE与OR AND OR和LIKE?

docker - 安装 laravel 时获取 msg 为 "cmdlet Invoke-WebRequest at command pipeline position 1 Supply values for the following parameters: Uri:"

php - Laravel 函数 Model::destroy() 中的参数太少

php - 使用 Paypal 注册

php - 如何形成帖子(验证和更新我的数据库)- Controller 语法

php - artisan 错误记录详细级别

php - Laravel 队列作业延迟执行