#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 вы можете создать пользовательский объект правила Давайте посмотрим, как мы можем заставить его работать.
- Создайте свое правило с
php artisan make:rule EmailRule
- Сделайте так, чтобы это выглядело следующим образом
<?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###.';
}
}
- Включите в свои правила, чтобы это выглядело как
return [
'recipients.*' => [new EmailRule()],
'cc.*' => [new EmailRule()],
'bcc.*' => [new EmailRule()],
];
- Напишите тест (необязательно)