Laravel Logo

Laravel 11

Nowa era minimalizmu i Developer Experience

Wydanie: 12 Marca 2024

Główne cele Laravel 11

Laravel 11 nie jest rewolucją, lecz ewolucją skupioną na:

  • Minimalizmie: Znaczące "odchudzenie" domyślnego szkieletu aplikacji.
  • Developer Experience (DX): Uproszczenie konfiguracji i codziennej pracy.
  • Nowoczesności: Pełne wsparcie dla najnowszych funkcji PHP.
  • Wydajności: Dalsze optymalizacje frameworka.

Wymagania systemowe

Podstawowym wymogiem do uruchomienia Laravel 11 jest:

PHP 8.2+

Pozwala to na korzystanie z nowych funkcji języka, takich jak:

  • Klasy readonly
  • Typy DNF (Disjunctive Normal Form)
  • I inne usprawnienia wydajności...

Kluczowa zmiana: Odchudzona struktura (1/4)

Największą wizualną zmianą jest domyślna struktura aplikacji.

Co zniknęło z domyślnego projektu?

  • Katalog app/Http/Kernel.php
  • Katalog app/Console/Kernel.php
  • Katalog app/Providers/ (wraz z 9 Service Providerami)
  • Katalog config/ (domyślnie pusty!)
  • Plik app/Exceptions/Handler.php

Efekt: Mniej "szumu" w projekcie, skupienie na kodzie biznesowym.

Kluczowa zmiana: bootstrap/app.php (2/4)

Prawie cała konfiguracja startowa aplikacji została przeniesiona do jednego pliku:


                <?php
                
                use Illuminate\Foundation\Application;
                use Illuminate\Foundation\Configuration\Exceptions;
                use Illuminate\Foundation\Configuration\Middleware;
                
                return Application::configure(basePath: dirname(__DIR__))
                    ->withRouting(
                        web: __DIR__.'/../routes/web.php',
                        commands: __DIR__.'/../routes/console.php',
                        health: '/up', // Nowy, wbudowany endpoint!
                    )
                    ->withMiddleware(function (Middleware $middleware) {
                        // Rejestracja globalnego middleware
                        $middleware->web(append: [
                            \App\Http\Middleware\HandleInertiaRequests::class,
                        ]);
                    })
                    ->withExceptions(function (Exceptions $exceptions) {
                        // Obsługa wyjątków
                    })->create();
                

Kluczowa zmiana: "Kaskadowa" konfiguracja (3/4)

Katalog config/ jest teraz opcjonalny.

  • Laravel 11 ładuje zoptymalizowaną konfigurację z poziomu frameworka (z katalogu vendor).
  • Jeśli chcesz coś zmienić, publikujesz tylko ten jeden plik, który chcesz zmodyfikować.
  • php artisan config:publish database
    (Stworzy tylko plik config/database.php)
  • Wartości można też (jak zawsze) wygodnie zmieniać w pliku .env.

Kluczowa zmiana: Gdzie reszta? (4/4)

  • Service Providers? Większość jest ładowana automatycznie przez framework. Jeśli potrzebujesz własny, po prostu go utwórz i zarejestruj w bootstrap/app.php.
  • Routing middleware? Definiowane w bootstrap/app.php za pomocą ->withMiddleware().
  • Komendy konsolowe? Rejestrowane automatycznie w pliku routes/console.php (nie trzeba ich już ładować w Kernelu).

Domyślna baza danych: SQLite

Nowe projekty domyślnie używają SQLite.

  • Dlaczego? Umożliwia start pracy (i testów!) bez instalowania serwera MySQL czy PostgreSQLa.
  • Wystarczy uruchomić: php artisan migrate
  • Framework automatycznie utworzy plik bazy danych database/database.sqlite.
  • Oczywiście, zmiana na MySQL/PostgreSQL to nadal kwestia zmiany DB_CONNECTION w pliku .env.

Nowy endpoint: /up

Laravel 11 automatycznie definiuje prosty endpoint /up do monitorowania stanu aplikacji.

  • Jest on zdefiniowany w bootstrap/app.php.
  • Służy do integracji z systemami monitoringu (np. Kubernetes, AWS, Pingdom).
  • Domyślnie sprawdza tylko, czy aplikacja odpowiada (status 200).
  • Można do niego dodać własne "checki" (np. połączenie z bazą, cachem, Redisem) za pomocą eventu DiagnosingHealth.

Rate Limiting co do sekundy

Poprzednie wersje Laravela pozwalały na limitowanie zapytań tylko na poziomie minutowym.

Laravel 11 wprowadza limitowanie per-sekunda:


                // W routes/api.php lub web.php
                Route::middleware('auth:sanctum')
                    ->prefix('v1')
                    ->group(function () {
                        // Limituj do 10 zapytań na sekundę
                        Route::get('/user', ...)
                             ->middleware('throttle:10,second');
                    });
                
                // Lub w RateLimiter::for() w AppServiceProvider
                RateLimiter::for('api', function (Request $request) {
                    return Limit::perSecond(10)->by($request->user()?->id ?: $request->ip());
                });
                

Płynna rotacja klucza APP_KEY

Problem: Zmiana APP_KEY w działającej aplikacji unieważniała wszystkie zaszyfrowane dane (np. sesje, cookie, zaszyfrowane pola w bazie).

Rozwiązanie w L11:

  • W pliku .env można zdefiniować listę poprzednich kluczy.
  • APP_PREVIOUS_KEYS=key_1,key_2,key_3
    (Oddzielone przecinkami)
  • Podczas deszyfrowania, Laravel najpierw spróbuje nowego APP_KEY.
  • Jeśli się nie uda, automatycznie spróbuje kluczy z APP_PREVIOUS_KEYS.
  • Nowe dane są zawsze szyfrowane tylko nowym kluczem APP_KEY.

Definiowanie "castów" jako metody

Chociaż właściwość $casts nadal działa, preferowanym sposobem definiowania "castów" w modelu jest teraz metoda casts().


                // Stare podejście (nadal działa)
                class User extends Model
                {
                    protected $casts = [
                        'options' => 'array',
                        'status' => StatusEnum::class,
                        'is_active' => 'boolean',
                    ];
                }

                // Nowe, preferowane podejście w L11
                class User extends Model
                {
                    protected function casts(): array
                    {
                        return [
                            'options' => AsArrayObject::class,
                            'status' => AsEnum::class,
                            'is_active' => 'boolean',
                        ];
                    }
                }
                

Daje to większą elastyczność i pozwala na używanie klas `As...` (np. `AsArrayObject` zamiast zwykłego 'array').

Ekosystem ery L11: Laravel Reverb

Choć to osobny pakiet, Reverb jest "duchowym" elementem ery L11.

  • Oficjalny, pierwszorzędny serwer WebSocket dla Laravela.
  • Napisany w PHP (bazuje na event-loop z ReactPHP).
  • Ekstremalnie szybki i skalowalny (wbudowane wsparcie dla Redis).
  • Pełna integracja z systemem broadcastingu Laravela (kompatybilny z protokołem Pusher).
  • Wbudowany monitoring.

                # Instalacja
                php artisan install:reverb
                
                # Uruchomienie
                php artisan reverb:start
                

Ekosystem ery L11: Laravel Prompts

Kolejny pakiet definiujący L11 to Prompts – rewolucja w komendach konsolowych.

  • Zastępuje stare metody $this->ask(), $this->confirm().
  • Tworzy piękne, interaktywne formularze w terminalu.
  • Wbudowana walidacja, podpowiedzi, autouzupełnianie, multiselect.

                use function Laravel\Prompts\text;
                use function Laravel\Prompts\select;
                use function Laravel\Prompts\password;
                
                $name = text(label: 'Jaka jest nazwa projektu?', required: true);
                
                $type = select(
                    label: 'Jaki to typ projektu?', 
                    options: ['app', 'package']
                );

                $apiKey = password(label: 'Podaj API Key:', validate: true);
                

Podsumowanie Laravel 11

  • Minimalizm: Znacznie czystszy start projektu i mniej "szablonowego" kodu.
  • Konfiguracja: Scentralizowana w bootstrap/app.php i kaskadowe pliki config.
  • DX (Developer Experience): Domyślny SQLite i endpoint /up ułatwiają start i monitoring.
  • Nowe funkcje: Płynna rotacja kluczy APP_KEY, limitowanie zapytań per-sekunda.
  • Ekosystem: Reverb (WebSockets) i Prompts (CLI) wyznaczają nowe standardy interaktywności.

Dziękuję za uwagę!

Czas na pytania?

Dowiedz się więcej: Oficjalna dokumentacja Laravel 11