Проверка ввода пользователя является важной частью любого веб-приложения. Одним из общих аспектов этой проверки является обеспечение того, чтобы пользователи вводили действительный адрес электронной почты. Однако может быть сложно проверить адреса электронной почты, которые являются временными или одноразовыми, например адреса из таких служб, как Mailinator или Guerrilla Mail. К счастью, Laravel позволяет легко реализовать временную проверку электронной почты с помощью настраиваемых правил проверки.

Назовем наше правило TempEmail. Для начала мы можем использовать команду php artisan make:rule TempEmail, чтобы создать новое правило проверки для временных электронных писем. Это создаст новый класс в каталоге App/Rules, который мы можем использовать для реализации нашей логики проверки.

Чтобы проверить временную электронную почту, добавьте следующий код в класс TempEmail. Этот код проверяет суть GitHub на наличие временных доменов электронной почты, занесенных в черный список, и кэширует результаты на 10 минут. Любые обновления сути также будут отражены в кэшированных результатах. Затем код реализует базовую логику для сравнения домена электронной почты с черным списком.

<?php

namespace App\Rules;

use Cache;
use Illuminate\Contracts\Validation\Rule;

class TempEmail implements Rule
{
    protected $blacklistedDomains;

    public function __construct()
    {
        $this->blacklistedDomains = Cache::remember('TempEmailBlackList', 60 * 10, function () {
            $data = @file_get_contents('https://gist.githubusercontent.com/saaiful/dd2b4b34a02171d7f9f0b979afe48f65/raw/2ad5590be72b69a51326b3e9d229f615e866f2e5/blocklist.txt');
            if ($data) {
                return array_filter(array_map('trim', explode("\n", $data)));
            }
            return [];
        });
    }

    public function passes($attribute, $value)
    {
        $emailDomain = substr(strrchr($value, "@"), 1);
        return !in_array($emailDomain, $this->blacklistedDomains);
    }

    public function message()
    {
        return 'This email not allowed.';
    }
}

Затем мы можем добавить наше новое правило проверки в список правил, которые Laravel использует при проверке пользовательского ввода. Мы можем сделать это, открыв AppServiceProvider и добавив следующий код в метод boot:

use App\Rules\TempEmail;
use Illuminate\Support\Facades\Validator;

...

Validator::extend('temp_email', function ($attribute, $value, $parameters, $validator) {
    return (new TempEmail())->passes($attribute, $value);
}, (new TempEmail())->message());

Этот код регистрирует новое правило проверки под названием temp_email, которое использует наш класс правил TempEmail для проверки адресов электронной почты. Всякий раз, когда это правило используется при проверке, Laravel будет вызывать метод passes класса TempEmail, чтобы определить, действителен ли адрес электронной почты.

Теперь, когда мы зарегистрировали наше новое правило проверки, мы можем использовать его в любой проверке Laravel, как и любое другое правило. Например, мы могли бы использовать его для проверки адреса электронной почты пользователя следующим образом:

$validator = Validator::make($request->all(), [
  'email' => 'required|email|temp_email',
]);

// or

$request->validate([
  'email' => 'required|email|temp_email',
]);

Это гарантирует, что поле email является обязательным, содержит действительный адрес электронной почты и не является временным адресом электронной почты.

С помощью этих простых шагов мы можем легко реализовать временную проверку электронной почты в наших приложениях Laravel. Создав пользовательское правило проверки и зарегистрировав его в Laravel, мы можем гарантировать, что наши пользователи вводят действительные адреса электронной почты, и предотвратить использование временных или одноразовых адресов электронной почты.