Laravel 8 újdonságok
Címkék
PHP
Megosztás

Laravel 8 újdonságok

Király Bence

Szeptember 8-án megjelent a Laravel 8, ami bár nem LTS kiadás, számos újítást hozott magával. ​

Laravel Jetstream

​ Az első újdonság a Laravel Jetstream, amivel egy erős kezdőlöketet adhatunk projekteinknek. ​ Az előző verziókban a laravel/ui csomaggal lehetett generálni az esetleges frontend/backend elemeket (például egy regisztrációs oldalt). Ezt váltja le a laravel/jetstream, ami a következőket tartalmazza: ​

  • autentikáció
  • kétlépcsős azonosítás
  • session kezelés
  • API támogatás (Laravel Sanctum segítségével)
  • csapatmenedzsment

Mindezt Tailwind CSS alapokra építve, illetve tetszés szerint választhatunk Inertia (szervervezérelt egyoldalas alkalmazás) és Livewire (full-stack framework) közül. ​

app/Models könyvtár

​ A controllerekhez hasonlóan a modellek is egy külön könyvtárat kaptak, app/Models néven. Valamint, a főbb parancsok mostantól vizsgálni fogják, hogy a modellek az app/Models vagy az app alatt találhatóak-e, és ennek megfelelően fognak cselekedni. Tehát, ha régebbi verzióról frissítünk 8-ra, nem szükséges létrehoznunk ezt a mappát, működni fog a régi mappastruktúrával is. ​

A Laravel megalkotója - Taylor Otwell - Twitterre posztolt egy szavazást, melyben az látható, hogy a szavazók 80.6%-a eddig is egy manuálisan létrehozott app/Models könyvtárat használt a modellek tárolására. ​

Factory átalakítások

​ Teljes átalakítás alá kerültek a factoryk, amik mostantól class alapúak. A factory definiálás pedig egy definition() metóduson belül kapott helyet. ​

class UserFactory extends Factory { protected $model = User::class; ​ public function definition() { return [ 'name' => $this->faker->name, 'email' => $this->faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => '$2y$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', // password 'remember_token' => Str::random(10), ]; } }

​ A HasFactory traittel elérhetővé válik a factory() method a modelleken, amivel az eddig is megszokott módon használható a create(), make() stb. ​

$user = User::factory()->create(); $evenMoreUsers = User::factory()->count(50)->create();

​ Mivel a factoryk mostantól nem closure, hanem class alapúak, lehetőség nyílik saját metódusok létrehozására is. ​

public function suspended() { return $this->state([ 'account_status' => 'suspended', ]); }

​ Amik ilyen egyszerűen használhatóak: ​

User::factory()->count(5)->suspended()->create();

Migration dump

​ Mindenki számára ismerős lehet a hosszú idők alatt felgyülemlő, átláthatatlan migration halom. A Laravel 8 erre is megoldást ad.

Mostantól a php artisan schema:dump parancs használatával egy SQL fájl készíthető az eddigi migrációkról, ami a database/schema könyvtárba fog kerülni. Ezután minden php artisan migrate futtatáskor a Laravel először egy SQL fájlt fog keresni, majd a hátralévő migrációkat elvégezni (amik nem voltak az SQL része). A --prune flag használatával pedig nem csak egy dumpot fog készíteni a Laravel, hanem törli is az érintett migrációkat. ​

Feladat csoportosítás

​ Mostantól akár csoportosan is megadhatóak feladatok, amik egyidejűleg fognak lefutni, közös callbackkel. ​

$batch = Bus::batch([ new ProcessPodcast(Podcast::find(1)), new ProcessPodcast(Podcast::find(2)), new ProcessPodcast(Podcast::find(3)), new ProcessPodcast(Podcast::find(4)), new ProcessPodcast(Podcast::find(5)), ])->then(function (Batch $batch) { // Ha minden feladat sikeresen lefutott })->catch(function (Batch $batch, Throwable $e) { // Ha valamelyik feladat hibába ütközött })->finally(function (Batch $batch) { // Ha minden feladat lefutott (akár sikeresen, akár hibásan) })->dispatch();

Feljavított Rate Limiter

​ A Rate Limiter kapott egy saját RateLimiter facade-ot, míg visszafelé kompatibilis maradt az eddig megszokott throttle middleware-rel is. ​

RateLimiter::for('authentication', function (Request $request) { return Limit::perMinute(10); });

​ Ezek az előre megszabott Rate Limiterek felhasználhatóak a throttle middleware-ben. ​

Route::get('/login')->middleware(['throttle:authentication']);

Maintenance Mode újítások

​ Az eddigi Laravel verziókban előre meg kellett adni azokat az IP címeket, amik karbantartás alatt továbbra is elérhették a weboldalt. Ezt a Laravel 8-ban a --secret flag váltja fel, ami lényegében egy titkos kulcsszó. ​

php artisan down --secret="1630542a-246b-4b66-afa1-dd72a4c43515"

​ Ezután ha valaki megnyitja a https://example.com/1630542a-246b-4b66-afa1-dd72a4c43515 címet, hozzáférést nyer a weboldalhoz. ​ Emellett megadható az is, hogy a karbantartás miatt kizárt felhasználók mit lássanak a weboldal tartalma helyett. ​

php artisan down --render="errors::503"

dispatch()->catch()

​ Mostantól a dispatch() rendelkezhet egy catch()-be burkolt closure-rel, ami akkor fog lefutni, ha hiba történik a feladat elvégzése során. ​

dispatch(function () { // Feladat })->catch(function (Throwable $e) { // Ha hibába ütközött a feladat });

Dinamikus Blade komponensek

​ Ha nem tudjuk előre, hogy melyik komponensre lesz szükségünk (esetleg runtime alatt fog eldőlni), akkor mostantól bevethetünk egy dinamikus komponenst, mint placeholder. ​

<x-dynamic-component :component="$componentName" class="mt-4" />

Closure alapú Event::listen()

​ Az Event::listen()-hez mostantól elég lesz egy closure is, nem kell megadni a megfigyelendő event classt. Ilyenkor a Laravel alaposan megvizsgálja a closuret, és megpróbálja kideríteni, hogy milyen eventhez szól. ​

Event::listen(function (PodcastProcessed $event) { // });

​ Ezen felül, a listenerek mostantól megjelölhetőek queueable-ként is. Az eddigi Laravel verziókban ez csak a ShouldQueue traittel volt lehetséges. ​

Event::listen(queueable(function (PodcastProcessed $event) { // }));

​ A sorbaállított feladatokhoz hasonlóan, itt is ugyanúgy használható az onConnection, onQueue és delay method. ​

Event::listen(queueable(function (PodcastProcessed $event) { // })->onConnection('redis')->onQueue('podcasts')->delay(now()->addSeconds(10)));

​ Illetve elláthatjuk egy catch()-be burkolt closure-rel is. ​

Event::listen(queueable(function (PodcastProcessed $event) { // })->catch(function (PodcastProcessed $event, Throwable $e) { // Ha hibába ütközött a listener }));

Időutazás

​ Tesztelések során belefuthatunk abba, hogy egy bizonyos időpontot szeretnénk tesztelni. Mostantól a feature tesztek egy beépített időutazó helperrel rendelkeznek, amivel tetszőleges időpontokat tesztelhetünk. ​

// Ugrás a jövőbe $this->travel(5)->milliseconds(); $this->travel(5)->seconds(); $this->travel(5)->minutes(); $this->travel(5)->hours(); $this->travel(5)->days(); $this->travel(5)->weeks(); $this->travel(5)->years(); ​ // Ugrás a múltba $this->travel(-5)->hours(); ​ // Ugrás egy megadott időpontba $this->travelTo(now()->subHours(6)); ​ // Visszatérés a jelenbe $this->travelBack();

php artisan serve

​ Mostantól nem kell újraindítani a php artisan serve-t az .env fájl módosításakor. ​

Tailwind Pagination

​ A Laravel paginator mostantól alapértelmezetten a Tailwind CSS-t fogja használni. Ettől függetlenül a Bootstrap opció ugyanúgy elérhető marad. ​

Controller namespace a Route-ban

​ Illetve még egy fontos változtatás történt. Az eddigi Laravel verziókban a RouteServiceProvider-en belül megadható volt az a namespace, amit a controllerek meghívásakor használ a Route. ​

protected $namespace = 'App\Http\Controllers';

​ Ez néhol namespace duplikációt okozott, ezért Laravel 8-ban ennek az alapértelmezett értéke null lett, tehát minden namespaceről nekünk kell gondoskodni. Ha esetleg mégis ragaszkodnánk az eddig megszokott módszerhez, csak annyi a teendő, hogy kézzel újra beleírjuk a RouteServiceProvider-be ezt a propertyt. ​

További részletek

Természetesen mi is tudunk segíteni bármilyen a Laravel-t érintő kérdésben. Keressetek minket bizalommal a contact@webcapital.hu címen, vagy a Facebookon.