Laravel 8 újdonságok

Laravel 8 újdonságok

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.dev címen, vagy a Facebookon.