Před zhruba dvěma týdny vyšla, již pravidelně co půl roku, nová verze s názvem Laravel 8. Díky tomu, že uběhla nějaká doba od oficiálního vydání, máme velkou pravděpodobnost, že další composer balíčky, které v projektu používáme a mají přímou závislost na Laravelu, budou již na novou verzi připraveny. Nejnovější verze přináší řadu novinek, které si podrobněji vysvětlíme.

Nový adresář pro modely

Nově najdeme v adresáři app složku Models a společně s tím se změnil i namespace u modelů na App\Models. Díky tomu při zavolání artisana pro vytvoření modelu php artisan make:model Post se vytvoří model rovnou v adresáři Models. Avšak pokud se vám tato změna nelíbí nebo prostě tam ty modely nechcete, stačí adresář smazat. V tom případě Laravel pozná, že tam adresář není a bude modely vytvářet v adresáři app tak jak tomu bylo u předchozích verzí.

Sjednocení všech migrací do jediného sql souboru

Pokud vám aplikace běží na Laravelu již nějakou dobu, určitě se vám adresář database/migrations s migracemi rozrostl do obrovských rozměrů. Laravel nám nyní nabízí možnost využít příkazu php artisan schema:dump, který sjednotí všechny migrace do jediného schema souboru. Po zavolání příkazu se vytvoří nový adresář database/schema a v něm se vytvoří sql soubor, který obsahuje celou strukturu složenou z migrací. Při vykonání migrací příkazem php artisan migrate se Laravel prvně podívá na to, jestli existuje schema soubor. Pokud ano, prvně se zavolá tento sql soubor a až poté se vykonají další migrace. V opačném případě se migrace zavolají jako obvykle.

Factory modelu ve třídě

U předchozích verzí byly faktorky modelů pro seedy/testy obyčejné php soubory, které obsahovaly pouze closury s definicemi vygenerování dat. Nově však jsou tyto faktorky generovány jako třídy, díky čemu nám poskytují větší flexibilitu. Třídy obsahují proměnou model, která definuje na jaká model je faktorka navázána. Dále obsahuje metodu definition(), která stejně jako v předchozích verzích Laravelu, definuje hodnoty vygenerované pro model. Modely nově také obsahují trait use HasFactory;, který obsahuje statickou metodu factory(). Když tedy budeme potřebovat vygenerovat nový model pomocí dat z factory, můžete jít rovnou přes model, např. App\Models\User::factory()->create();

Údržba stránky s tajným přístupem

Při údržbě stránek můžeme využít příkazu php artisan down, který automaticky nastaví stránce status 503. Nicméně pokud bychom chtěli mít i přesto přístup do naší aplikace, zatímco ostatním stále zobrazovat 503, nově využijeme příkazu php artisan down --secret="tajneheslo". Právě string, který dáme do parametru secret, je naše tajné heslo pro přístup do aplikace. Pokud na stránkách zadáme cestu http://example.com/tajneheslo, tak získáme přístup do naší aplikace a při dalším průchodu již není potřeba nic znovu zadávat. To je řešené díky cookie, které Laravel nastaví. Tedy pokud chcete znovu vidět 503, stačí smazat dané cookie.

Červí díry

Balíček Carbon pro práci s časem nyní obsahuje třídu Wormholes, která dokáže cestovat časem. Konkrétně řečeno, dokáže posunout aktuální den/čas do budoucnosti nebo minulosti. Tato metoda se využije především při testování (nenapadá mě ani jiné využití), kdy potřebujeme nasimulovat, že je aktuální den jiný než v reálu.

...test trida
$this->travel(14)->days(); // now() nyni vraci dva tydny dopredu
$this->travelTo(now()->addMonth()); // muzeme nastavit konkretni den
$this->travel(-1)->weeks(); // pro cestovani zpet musime pouzit minus

Rate limity

V Laravel 8 byla upravena syntaxe pro definování rate limitů. Rate limity slouží k definování počtu requestů (nejčasteji za minutu), které můžeme nad danou URL provést. Často se toto omezení využívá pro API požadavky. Nově v definici middleware v App\Http\Kernel namísto limitu nastavujeme pouze alias, např:

class Kernel extends HttpKernel {
    protected $middlewareGroups = [
        'web' => [
            \App\Http\Middleware\EncryptCookies::class,
            \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
            \Illuminate\Session\Middleware\StartSession::class,
            // \Illuminate\Session\Middleware\AuthenticateSession::class,
            \Illuminate\View\Middleware\ShareErrorsFromSession::class,
            \App\Http\Middleware\VerifyCsrfToken::class,
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],

        'api' => [
            'throttle:api', // prave zde nastavujeme alias "api" pro rate limit
            \Illuminate\Routing\Middleware\SubstituteBindings::class,
        ],
    ];
}

Samotné nastavení rate limitu pro tento alias definujeme v App\Providers\RouteServiceProvider, které se trochu změnilo narozdíl od předešlé verze Laravelu. Nově zde můžeme využít metody configureRateLimiting():

    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return Limit::perMinute(60);
        });
    }

Konkrétně metoda perMinute(60) nastavuje 60 požadavků za minutu. Při jejím překročení vyskočí chybová hláška s http statusem 429. Pokud potřebujete provést nějakou výjimku, které se to nemá týkat, můžeme využít metody none(), např:

    protected function configureRateLimiting()
    {
        RateLimiter::for('api', function (Request $request) {
            return $request->user()->id() === 1 ? Limit::none() : Limit::perMinute(60);
        });
    }

V tomto případě se uživatele s ID 1 omezení netýká, ale ostatních ano. V případě, že by jste toto omezení nechtěli dávat na celou middleware skupinu, můžete ho definovat rovnou na konkrétní routu:

Route::get('/nejaka-api-routa', fn() => 'API request')->middleware('throttle:api');

Jetstream

Jetstream je nová utilita Laravelu, která vygeneruje velkou část aplikace pokud začínáte s novým projektem. Hned od začátku vygeneruje login, registraci, emailové ověření, dvoufaktorové přihlášení, session management a mnoho dalšího. Jako design stránek je použit Tailwind CSS a navíc je možné nechat si Laravelem vygenerovat také Livewire nebo Inertia komponenty.

Sepsal jsem zde pouze ty nejvýznamnější novinky, Laravel 8 samozřejmě obsahuje mnohem více. Vše se dozvíte na oficiálních stránkách.