RateLimiter в Laravel 8
RateLimiter делает управление скоростью обработки запросов более простым, масштабируемым и удобным в применении. Подумайте об этом, если планируете перейти на Laravel 8.
В прошлых версиях Laravel, включая седьмую, при необходимости ограничения скорости обработки запросов на определённых маршрутах, пользователь мог реализовать это с помощью throttle:
В данной конфигурации параметр 30,1 означает, что аутентифицированный юзер может получать доступ к маршруту тридцать раз в минуту, а если он превысит данный лимит, фреймворк Laravel вернет ошибку 429 Too Many Requests.
Однако числа захардкожены и нет возможности настроить их динамическое изменение либо переиспользование этой настроенной конфигурации для иных маршрутов. Сегодня данную проблему можно решить в Laravel 8, что достигается с помощью фасада RateLimiter.
Фасад RateLimiter
Используя фасад Illuminate\Support\Facades\RateLimiter, вы получите возможность задать «именованные» ограничители скорости разных конфигураций. Так как у них теперь существуют имена, в свою очередь, появляется возможность применять их для различных маршрутов и групп этих маршрутов.
Вдобавок к этому, вы сможете создавать несколько ограничителей скорости для различных вариантов применения.
Ограничители прописывают в методе boot в AppServiceProvider. К примеру, если нужен ограничитель limitadmin, можно поступить следующим образом:
В данном случае метод for в RateLimiter принимает 2 параметра: • название ограничителя скорости; • замыкание, возвращающее конфигурацию ограничения для маршрутов.
В замыкании можно вернуть фактическое ограничение скорости запросов, применяя метод perMinute из Illuminate\Cache\RateLimiting\Limit, где вы указываете, сколько раз в минуту юзеру разрешён доступ к маршруту.
Применяем именованный ограничитель скорости
После создания ограничителя скорости вы сможете назначить маршрут:
Как можно видеть, вместо закардкоженной конфигурации, вы просто задействуете имя ограничителя. В результате получаем читабельное и доступное для многократного применения решение.
Динамические ограничители
Есть возможность создавать также и ограничители скорости запросов, которые основаны на определённых условиях.
К примеру, замыкание метода for получает объект Illuminate\Http\Request, поэтому мы можем его использовать. Допустим, надо ограничивать лишь обычных пользователей, но не администраторов. Реализовать это можно следующим образом:
Таким образом, используя метод
Кастомный ответ
Вдобавок ко всему, вместо стандартного 429 Too Many Requests мы можем вернуть свой собственный ответ, для чего пригодится метод response:
Вот так вот. Пожалуй, теперь вы не будете спорить с тем, что RateLimiter делает управление скоростью обработки запросов более простым, масштабируемым и удобным в применении.
По материалам статьи «New RateLimiter facade for defining named rate limiters in Laravel 8».