• Czas czytania ~2 min
  • 04.07.2022

 

Jedna magia

 

Photo by Jad Limcaco on Unsplash

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 , Closureograniczenie 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.

Comments

No comments yet
Yurij Finiv

Yurij Finiv

Full stack

O

Professional Fullstack Developer with extensive experience in website and desktop application development. Proficient in a wide range of tools and technologies, including Bootstrap, Tailwind, HTML5, CSS3, PUG, JavaScript, Alpine.js, jQuery, PHP, MODX, and Node.js. Skilled in website development using Symfony, MODX, and Laravel. Experience: Contributed to the development and translation of MODX3 i...

O autorze CrazyBoy49z
WORK EXPERIENCE
Kontakt
Ukraine, Lutsk
+380979856297