首页 > 解决方案 > 数组项的 Laravel 条件验证规则

问题描述

我有以下有效的验证规则,它检查以确保每个收件人、抄送、密送电子邮件列表都包含有效的电子邮件地址:

  return [
            'recipients.*' => 'email',
            'cc.*' => 'email',
            'bcc.*' => 'email',
        ];

我还需要能够允许###EMAIL###对这些规则中的每一个进行字符串和电子邮件验证,并努力在 Laravel 5.8 中创建自定义验证规则(目前无法升级)。

知道该怎么做吗?如果它是 Laravel 的更高版本,我正在考虑类似(未测试)的东西,让您了解我正在尝试做的事情:

return [
    'recipients.*' => 'exclude_if:recipients.*,###EMAIL###|email',
    'cc.*' => 'exclude_if:recipients.*,###EMAIL###|email',
    'bcc.*' => 'exclude_if:recipients.*,###EMAIL###|email',
];

标签: laravelvalidationlaravel-5.8

解决方案


在 5.8 中,您可以创建自定义规则对象让我们看看我们如何实际使其工作。

  1. 创建你的规则php artisan make:rule EmailRule
  2. 让它看起来像这样
<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class EmailRule implements Rule
{
    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        if ($value === '###EMAIL###' or filter_var($value, FILTER_VALIDATE_EMAIL)) {
            return true;
        }
        return false;
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The :attribute must be valid email or ###EMAIL###.';
    }
}
  1. 包含在您的规则中,使其看起来像
return [
    'recipients.*' => [new EmailRule()],
    'cc.*' => [new EmailRule()],
    'bcc.*' => [new EmailRule()],
];
  1. 编写测试(可选)

推荐阅读