🢂Niestandardowe komendy i routing w Laravel Artisan

Poznaj sposoby tworzenia własnych komend Artisan oraz zarządzania routingiem w Laravel. Ten artykuł pokazuje, jak zwiększyć wydajność pracy dzięki automatyzacji zadań i lepszemu zarządzaniu routingiem.

Artisan w Laravel nie tylko oferuje gotowe polecenia, ale też umożliwia tworzenie własnych, niestandardowych komend. Ponadto dostarcza narzędzia do skutecznego zarządzania routingiem aplikacji. W tym artykule omówimy oba te tematy.

Niestandardowe Komendy Artisan

Laravel umożliwia tworzenie własnych, niestandardowych poleceń Artisan, które mogą znacząco zwiększyć wydajność pracy i automatyzować powtarzalne zadania. Do tworzenia takich poleceń służy komenda php artisan make:command [NazwaKomendy], która generuje nowy plik klasy komendy w katalogu app/Console/Commands.

Polecenie make:command tworzy klasę z podstawową strukturą niezbędną do zdefiniowania własnego polecenia, w tym metodami:

  • signature - definiuje nazwę i parametry polecenia
  • description - zawiera opis polecenia
  • handle - zawiera logikę polecenia, która zostanie wykonana

Opcja --command=[nazwa] pozwala na określenie sygnatury polecenia w momencie jego tworzenia. Na przykład, php artisan make:command SendEmails --command=emails:send utworzy nowe polecenie, które będzie można wywołać jako php artisan emails:send.

Niestandardowe polecenia Artisan są szczególnie przydatne w sytuacjach takich jak:

  • Automatyzacja powtarzalnych zadań deweloperskich
  • Tworzenie skryptów konserwacyjnych
  • Wykonywanie operacji w tle
  • Integracja z zewnętrznymi API
  • Generowanie raportów
  • Importowanie i eksportowanie danych

Przykłady użycia niestandardowych komend

Poniżej znajduje się zestaw praktycznych przykładów tworzenia i używania niestandardowych poleceń Artisan:

# Utworzenie nowego polecenia Artisan
php artisan make:command SendDailyReports

# Utworzenie nowego polecenia z określoną sygnaturą
php artisan make:command ProcessPayments --command=payments:process

# Utworzenie polecenia w podkatalogu
php artisan make:command Reports/GenerateMonthlyReport

# Przykładowa implementacja polecenia w klasie (w pliku PHP)
protected $signature = 'emails:send {user? : ID użytkownika} {--queue= : Nazwa kolejki} {--all : Wyślij do wszystkich}';
protected $description = 'Wysyła e-maile do określonych użytkowników';

# Uruchomienie niestandardowego polecenia
php artisan emails:send

# Uruchomienie polecenia z argumentem
php artisan emails:send 5

# Uruchomienie polecenia z opcją
php artisan emails:send --queue=high

# Uruchomienie polecenia w środowisku produkcyjnym
php artisan emails:send --env=production

# Uruchomienie polecenia w tle
php artisan emails:send --queue=low > /dev/null 2>&1 &

# Uruchomienie polecenia z harmonogramu zadań (w App\Console\Kernel.php)
$schedule->command('emails:send')->daily();

Tworzenie zaawansowanych komend niestandardowych

Przy tworzeniu bardziej zaawansowanych komend, możesz wykorzystać następujące techniki:

# Tworzenie komendy z argumentami i opcjami
php artisan make:command ExportData --command="export:data {type} {--format=json}"

# Tworzenie komendy interaktywnej, która będzie pytać o dane wejściowe
php artisan make:command InteractiveSetup

# W klasie komendy możesz użyć:
$this->ask('Jaką nazwę chcesz nadać aplikacji?');
$this->secret('Wprowadź hasło do bazy danych');
$this->confirm('Czy chcesz uruchomić migracje?');
$this->choice('Wybierz środowisko', ['local', 'testing', 'production'], 'local');

# Tworzenie komendy z paskiem postępu
php artisan make:command ProcessLargeData

# W klasie komendy możesz użyć:
$bar = $this->output->createProgressBar(100);
$bar->start();
// ... w pętli
$bar->advance();
// ... po zakończeniu
$bar->finish();

Routing

Routing w Laravel odpowiada za mapowanie przychodzących żądań HTTP do odpowiednich kontrolerów i akcji. Artisan oferuje kilka poleceń do zarządzania routingiem.

Jednym z najważniejszych jest polecenie php artisan route:list, które wyświetla listę wszystkich zdefiniowanych tras aplikacji, w tym metodę HTTP, URI, nazwę trasy, akcję kontrolera oraz przypisane do niej middleware. Polecenie to oferuje wiele opcji filtrujących, które pomagają w zarządzaniu rozbudowaną listą tras:

  • Opcja --name=[nazwa] pozwala na filtrowanie tras po ich nazwie. Przykładowo, php artisan route:list --name=admin wyświetli tylko trasy, których nazwa zawiera "admin". Jest to szczególnie przydatne, gdy trasy są nazwane zgodnie z pewną konwencją.

  • Opcja --path=[ścieżka] umożliwia filtrowanie tras po ich ścieżce URI. Użycie php artisan route:list --path=api/users wyświetli tylko trasy, których URI zaczyna się od api/users. Pozwala to na łatwe przeglądanie tras należących do określonej sekcji aplikacji.

  • Opcja --method=[metoda] służy do filtrowania tras po metodzie HTTP. Przykładowo, php artisan route:list --method=POST wyświetli tylko trasy obsługujące żądania POST. Jest to pomocne podczas debugowania problemów z formularzami lub żądaniami API.

  • Opcja --middleware=[nazwa] pozwala na filtrowanie tras po przypisanym middleware. Polecenie php artisan route:list --middleware=auth wyświetli wszystkie trasy, które korzystają z middleware auth. Dzięki temu można łatwo sprawdzić, które trasy są chronione przez daną warstwę pośredniczącą.

W środowisku produkcyjnym, w celu zwiększenia wydajności, Laravel oferuje możliwość buforowania tras. Polecenie php artisan route:cache tworzy bufor tras, co znacząco przyspiesza proces rejestrowania tras przy każdym żądaniu. Buforowanie zmniejsza czas potrzebny na znalezienie odpowiedniej trasy dla przychodzącego żądania, ponieważ Laravel nie musi analizować wszystkich definicji tras przy każdym żądaniu, a zamiast tego korzysta z prekompilowanej listy. Po każdej zmianie w plikach routingu (znajdujących się w katalogu routes), konieczne jest wyczyszczenie bufora tras za pomocą polecenia php artisan route:clear, aby Laravel mógł uwzględnić najnowsze zmiany w definicjach tras.

Przykłady użycia poleceń routingu

Poniżej znajduje się zestaw praktycznych przykładów zarządzania routingiem w Laravel:

# Wyświetlenie wszystkich tras w aplikacji
php artisan route:list

# Wyświetlenie tras z określoną nazwą
php artisan route:list --name=admin

# Wyświetlenie tras dla określonej ścieżki
php artisan route:list --path=api/users

# Wyświetlenie tras dla określonej metody HTTP
php artisan route:list --method=POST

# Wyświetlenie tras z określonym middleware
php artisan route:list --middleware=auth

# Sortowanie tras według określonej kolumny
php artisan route:list --sort=uri

# Odwrócenie kolejności sortowania
php artisan route:list --sort=uri --reverse

# Filtrowanie tras po akcji kontrolera
php artisan route:list --action=UserController

# Wykluczenie tras vendorów
php artisan route:list --except-vendor

# Wyświetlenie tylko tras vendorów
php artisan route:list --only-vendor

# Wyświetlenie tras w formacie JSON (przydatne do dalszego przetwarzania)
php artisan route:list --json

# Buforowanie tras dla zwiększenia wydajności
php artisan route:cache

# Wyczyszczenie bufora tras po zmianach w plikach routingu
php artisan route:clear

# Sprawdzenie, które trasy nie mają nazwy (przydatne do optymalizacji)
php artisan route:list | grep -v 'as:' | grep -v '<Closure>'

# Znajdowanie konfliktów tras (duplikaty)
php artisan route:list | grep -E '^GET\s+/api/users' | wc -l

# Sprawdzenie, czy trasa jest poprawnie zdefiniowana
php artisan route:list --name=profile.show

# Wyświetlenie tras w określonej domenie
php artisan route:list --domain=api.example.com

Zaawansowane zarządzanie routingiem

Przy pracy z bardziej złożonymi aplikacjami często potrzebujemy bardziej zaawansowanych opcji zarządzania trasami:

# Wyświetlenie wszystkich tras z wykluczeniem określonej ścieżki
php artisan route:list --except-path=api

# Wyświetlenie tras z wykluczeniem określonego middleware
php artisan route:list --except-middleware=auth

# Filtrowanie zarówno po ścieżce jak i metodzie
php artisan route:list --path=users --method=POST

# Sprawdzenie tras z określonymi parametrami
php artisan route:list --path="users/{id}"

# Kontrola buforowania tras: najpierw wyczyść, potem stwórz nowy bufor
php artisan route:clear && php artisan route:cache

# Sprawdzenie, czy buforowanie tras jest aktywne
php artisan route:list --no-ansi | grep -i 'cached'

# Zaawansowane filtrowanie: trasy API z middleware auth
php artisan route:list --path=api --middleware=auth

Łączenie routingu z niestandardowymi komendami

W bardziej zaawansowanych scenariuszach możesz łączyć zarządzanie routingiem z własnymi komendami. Poniżej znajdują się przykłady:

# Tworzenie komendy do analizy routingu
php artisan make:command RouteAnalyzer --command="route:analyze"

# W klasie komendy możesz pobrać listę tras i wykonać na nich operacje:
$routes = Route::getRoutes();
foreach ($routes as $route) {
    // Analiza trasy
}

# Tworzenie komendy do eksportu tras
php artisan make:command ExportRoutes --command="route:export {format=json}"

# Tworzenie komendy do sprawdzania konfliktów tras
php artisan make:command CheckRoutingConflicts

# Tworzenie komendy do generowania dokumentacji API na podstawie tras
php artisan make:command GenerateApiDocs