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