Правило условной проверки Laravel для элементов массива

#laravel #validation #laravel-5.8

#laravel #проверка #laravel-5.8

Вопрос:

У меня есть следующее рабочее правило проверки, которое проверяет, чтобы каждый получатель, cc, список bcc электронных писем содержал действительные адреса электронной почты:

   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',
];
  

Ответ №1:

В 5.8 вы можете создать пользовательский объект правила Давайте посмотрим, как мы можем заставить его работать.

  1. Создайте свое правило с php artisan make:rule EmailRule
  2. Сделайте так, чтобы это выглядело следующим образом
 <?php

namespace AppRules;

use IlluminateContractsValidationRule;

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. Напишите тест (необязательно)