Jedna magia
metody Ogranicznik prędkości powinien być jedną z najbardziej pomijanych funkcji w Laravel. Dla tych, którzy są nowicjuszami w ograniczaniu szybkości, jego istota jest prosta do zrozumienia: "limit szybkości" czegoś w oparciu o maksymalną liczbę prób w oknie czasu.
Normalną i najczęstszą procedurą korzystania z ogranicznika szybkości jest najpierw sprawdzenie, czy klucz nie został wypróbowany zbyt wiele razy. Jeśli ten klucz jest dostępny, dopiero wtedy przystępujemy do wykonania naszej logiki. Na koniec zwiększamy liczbę prób wzdłuż okna czasu do "rozpadu".
Jest to w zasadzie logika dwuetapowa.
Powyższe przekłada się na "Jeśli foo
klucz został wypróbowany więcej niż 5 razy, zwróć coś. W przeciwnym razie wykonaj logikę i zwiększ foo
liczbę prób przez następne 60 sekund".
Innymi słowy, jeśli foo
klucz zostanie wypróbowany więcej niż 5 razy w ciągu 60 sekund, tooManyAttempts()
powróci true
i nic nie zostanie wykonane.
Powyższe działa dobrze przez większość czasu, ale zamiast dzwonić do ogranicznika szybkości dwa razy, z tym samym kluczem i pozostawiając logikę między dwoma wywołaniami, możemy zrobić coś prostszego.
Lubię onelinery, a niedawno dostałem zatwierdzoną małą pomocniczkę o nazwie attempt()
, która powinna wylądować w Laravel 8.53. To, co robi, to to samo, ale przy użyciu wywołania zwrotnego i z tym samym domyślnym 60 sekundami. Nasz powyższy przykład można wznowić w instrukcji warunkowej:
Ponieważ otrzymuje , Closure
ograniczenie szybkości może stać się przenośne. Na przykład możesz zapisać funkcję na początku i wykonać ją później, zamiast łączyć ograniczenie szybkości z tym, co masz między czekiem a działaniem. Alternatywnie zawsze możesz użyć .callable
Closure::fromCallable()
Najlepszą implementacją attempt()
jest tworzenie wywołań idempotentnych. Na przykład wyobraź sobie, że chcemy wysłać wiadomość do użytkownika, ale pominąć całą logikę, jeśli wiadomość jest dokładnie taka sama, jak wysłał mniej niż 2 minuty temu. Może się tak zdarzyć, jeśli połączenie jest niestabilne lub gdy użytkownik przypadkowo naciśnie "Wyślij" zbyt wiele razy.
Nie ma problemu, możemy uzyskać hash wiadomości jako klucz, a następnie sprawdzić, czy została wysłana wcześniej.
Ostatnią fajną rzeczą jest attempt()
to, że zwróci wynik wywołania zwrotnego. Gdy wywołanie zwrotne nic nie zwróci, lub null
, attempt()
powróci true
.
Na przykład, jeśli chcemy zwrócić model, nie ma problemu. Jeśli wywołanie zwrotne nie zostało wykonane, ponieważ osiągnęło limit szybkości, jest false
zawsze zwracane.