Laravel: jeden, by wszystkimi rządzić

Routing w Laraverze, szczególnie dla osób początkujących czy też migrujących z frameworków o zupełnie innej filozofii działania tego komponentu, może być naprawdę ciężkim orzechem do zgryzienia. Na szczęście jest na to sposób o czym w dzisiejszym odcinku przygód z Laravelem.

Zacznijmy od dokumentacji, w której mamy opisane wszystkie niezbędne metody. Niestety, myli się ten, kto myśli, że jest to banalne i nie wymaga komentarza. Na forach oraz w projektach na GitHubie widziałem sporo przykładów aplikacji w L4, w których plik app/routes.php powodował stan przedzawałowy.

Zauważyłem dwa główne problemy na które chciałbym zwrócić uwagę:

  • ogromną ilość reguł – ale naprawdę ogromną! Nie wierzę, że ktokolwiek uzasadni, w nawet dużej aplikacji, wymienienie 480 osobno zdefiniowanych reguł ścieżek! Już na pierwszy rzut oka widać, że przynajmniej połowa jest do pozbycia się stosując wyrażenia regularnie czy też odpowiednio modyfikując grupy ścieżek. Poważnie, nie musicie dla każdej akcji mieć osobnej definicji ścieżek! Inną kwestią jest sprawa wydajności – Laravel korzysta z kilku komponentów od Symfony2, w tym właśnie z ich routera. O Sf2 można powiedzieć wiele dobrego, niestety wydajność nie jest jego mocną stroną. Widać to bardzo dobrze w L4 przy zbyt dużej ilości reguł – aplikacja zaczyna lekko przymulać. Sprawa zrobiła się na tyle poważna, że kilka dni temu autor Laravela stwierdził iż router zostanie przepisany tak aby zachować obecne API, a jednocześnie zrezygnować z tego komponentu z Sf2.
  • laravel-router
    (fot. zrzut „debug toolbara” aplikacji w L4 jednego z użytkowników forum.php.pl, 227 definicji ścieżek)

  • przenoszenie logiki kontrolera do routera – mam prywatną teorię, że to wynik sposobu w jaki prezentowane są przykłady w oficjalnej dokumentacji. Niektórzy biorą to zbyt dosłownie i głowę daję, na GitHubie jest projekt (żałuje, że go sobie nie zapisałem), który w ogóle nie ma kontrolerów, a teoretycznie cała ich zawartość znajduje się w ogromnym pliku routes.php 😉 Nie mam nic przeciwko temu, że ktoś wciśnie kilka metod w router, które zajmują parę linijek (na ogół zwracających sam widok) i nie ma sensu tworzyć dla nich kontrolera, choć osobiście tego nie praktykuję, lubię mieć porządek i nie chce mi się potem zastanawiać czy mam szukać danego fragmentu w routerze czy danym kontrolerze.

My preciousss…

myprecious Pracę ze ścieżkami można sobie znacznie ułatwić, szczególnie na początku jest to wygodne. Nie polecam tego rozwiązania jako ostateczne i produkcyjne (chyba, że usprawnicie ten kod zawężając pewne akcje tylko do wywołań GET, pewnie do POST plus jakieś filtry), niemniej jest masa sytuacji w których jest niezastąpione. Choćby wszelkiego rodzaju prototypowania, sytuacje, w których trzeba zrobić coś natychmiast, tu i teraz, z zupełnym brakiem znaczenia czy to ogólnie dobre rozwiązanie. Pomyślcie, że jesteście na jakimś StartupWeekendzie, macie 2 dni na wykonanie prototypu jakiejś aplikacji, nie ma wtedy znaczenia czy coś jest bezpieczne, czy jest optymalnie i poprawnie zrobione. Liczy się tylko czas wykonania. I właśnie w takich sytuacjach polecam metodę „jednego pierścienia” 😉

Jeden, by wszystkimi rządzić, jeden, by wszystkie odnaleźć,
Jeden, by wszystkie zgromadzić i w ciemności związać.
(Władca Pierścieni, tłumaczenie: Maria Skibniewska)

Krótkie wytłumaczenie tego kodu: w pierwszej linii łapiemy wywołania (ANY – dotyczy wszystkich, możecie to zawęzić tylko do np. GET lub POST) gdzie pierwszy człon traktujemy jako kontroler, a drugi jako jego metodę (zwróćcie uwagę na znak zapytania na końcu – oczywiście oznacza to, że akcja nie musi występować). Ustawiamy podstawowe wartości na $controller = 'home' i $action = 'index', a niżej ładujemy dany kontroler ograniczając jednocześnie (where) nazwy do słów (litery i cyfry). Oczywiście możecie to rozszerzyć o kolejne parametry dla danej akcji.

Magiczna metoda

Na koniec warto też pamiętać o missingMethod($parametrs), swoisty „catch-all”, magiczna metoda, która złapie wszystkie odwołania do danego kontrolera do których nie znaleziono dopasowania do akcji.

Kiedy macie problemy z okiełznaniem ścieżek pamiętajcie rzucić okiem na artisana – metoda routes pomaga wyłapać pewne problemy wynikające np. z kolejności występowania wpisów w routes.php

Przede wszystkim admin, potem webdeveloper choć kiedyś było odwrotnie. Obecnie Full Stack Engineer, CTO i System Architect. Po godzinach fan dobrych seriali, których nigdy nie ma czasu obejrzeć. Kawożłop. Koneser prawdziwego piwa. W czasie pomiędzy kontuzjami biega.

Send this to a friend

webmastah.weekly
Cotygodniowa porcja linków ze świata WEBDEV BEZ spamu, TYLKO samo mięcho!
Zobacz poprzednie wydania. Dołącz do 2 tysięcy webdeveloperów!
HTML5, CSS3, JS (React, Angular, Ember, Vue), PHP, SQL