Laravel 9 - újdonságok röviden
Címkék
PHP
Megosztás

Laravel 9 - újdonságok röviden

Király Bence

Február 8-án megjelent a Laravel 9-es verziója. 17 hónap telt el a 8-as verzió óta, úgyhogy rengeteg újdonság vár ránk.

 

2 éves támogatás

Korábban már írtunk arról, hogy változás történt a Laravel verziók kiadásában, miszerint éves kiadási ciklusra váltanak a keretrendszer fejlesztői. Emellett megszűnik az LTS ág is, mivel minden új verzió 2 év támogatást kap.

A Laravel 9 így 2024. február 8.-ig támogatott lesz.

 

PHP 8

Mostantól követelmény lett a PHP 8.0 verziója. Ez azért van, mert a Laravel 9 a Symfony 6-ra épül, ami megköveteli a PHP 8-at. Ebben a posztban bővebben olvashattok a PHP 8-ról.

 

Névtelen migrációk

Mostantól lehetőségünk van névtelen migrációk létrehozására. Ez akkor hasznos, ha sok migrációt tartalmaz az alkalmazásunk, és esetleg újra létre szeretnénk hozni egy régebben törölt táblát, amivel duplikált migráció nevekbe ütköznénk.

php artisan make:migration

 

Symfony Mailer

A Laravel eddig a Swift Mailer csomagot használta, viszont ez a csomag 2021 november óta nincs karbantartva, így mostantól a Symfony Mailer-t fogja használni.

 

Flysystem 3.x

A Flysystem dependency 3.x verzióra váltott. Ez a csomag működteti a Storage facade-ot, így erre érdemes odafigyelni, ha korábbi verzióról frissítünk.

Itt található segítség a frissítéshez.

 

Megváltozott attribute getter/setter

Eddig az alábbi módon tudtunk Eloquent attribute gettereket/settereket létrehozni.

public function getNameAttribute($value) { return strtoupper($value); } public function setNameAttribute($value) { $this->attributes['name'] = $value; }

Itt viszont egy megszabott naming convention-t kellett követni, ami nem volt túl rugalmas. Laravel 9-ben viszont bármilyen névvel létre tudjuk őket hozni, az Attribute osztály használatával.

use Illuminate\Database\Eloquent\Casts\Attribute; public function name(): Attribute { return new Attribute( get: fn ($value) => strtoupper($value), set: fn ($value) => $value, ); }

 

Enum casting

PHP 8.1-ben bevezetésre került a natív Enum típus. Laravel 9-ben így már tudunk Enum típusra is castolni Eloquent attribute-okat.

use App\Enums\ServerStatus; protected $casts = [ 'status' => ServerStatus::class, ];

 

Enum route binding

enum Category: string { case Fruits = 'fruits'; case People = 'people'; } Route::get('/categories/{category}', function (Category $category) { return $category->value; });

A route akkor lesz érvényes, ha a {category} szegmens fruits vagy people, különben 404-es válasz lesz visszaküldve.

 

Route binding-ok scope-olása custom key nélkül

Eddig, ha custom key-t adtunk meg egy nested route paraméternek, a Laravel automatikusan megpróbálta összekötni a parent paraméterrel. Viszont ez csak akkor volt lehetséges, ha custom key-t használtunk.

Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) { return $post; });

Ez mostantól viszont custom key nélkül is lehetséges, ->scopeBindings() használatával.

use App\Models\Post; use App\Models\User; Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) { return $post; })->scopeBindings();

 

Controller Route csoportok

Mostantól csoportosan hozzárendelhetünk több route-hoz egy controllert.

use App\Http\Controllers\OrderController; Route::controller(OrderController::class)->group(function () { Route::get('/orders/{id}', 'show'); Route::post('/orders', 'store'); });

 

Full text index

A migrációkban mostantól megadható full text index (MySQL vagy PostgreSQL esetén).

$table->text('bio')->fullText();

Továbbá mostantól végezhetünk full text keresést ->whereFullText() használatával.

 

Laravel Scout adatbázis motor

Ha egyszerű, kisebb méretű adatbázissal rendelkezik az applikációnk, mostantól használhatjuk a Laravel Scout adatbázis motort (dedikált keresőmotorok helyett). Ez az adatbázis motor "where like" és full text indexek használatával fogja kiszűrni a találatokat a már meglévő adatbázisunkból.

Laravel Scout dokumentáció

 

Inline Blade template-ek

Mostantól "inline" is renderelhetünk Blade template-et anélkül, hogy létre kéne hozni fájlként.

use Illuminate\Support\Facades\Blade; return Blade::render('Hello, {{ $name }}', ['name' => 'Miguel']);

 

Megváltozott x-slot syntax

Megváltozott az x-slot syntax.

<!-- Régi syntax --> <x-slot name="title"> Server Error </x-slot> <!-- Új (opcionális) syntax --> <x-slot:title> Server Error </x-slot>

 

Bővült Blade syntax

Két új elemmel bővült a Blade syntax, @checked és @selected.

<input type="checkbox" name="isActive" value="isActive" @checked($user->isActive) /> <select> <option value="something" @selected($shouldBeSelected)> something </option> </select>

 

Bootstrap 5 pagination

Ha Tailwind helyett Bootstrap 5 pagination-t akarunk használni, az App\Providers\AppServiceProvider class-ban megtehetjük, az alábbi módon.

use Illuminate\Pagination\Paginator; public function boot() { Paginator::useBootstrapFive(); }

 

Bővült nested array validáció

Egy új eszközt kaptunk nested array validációra, ami a Rule::forEach(). Ebben megadhatunk egy Closure-t, ami minden egyes elemre megfut.

use App\Rules\HasPermission; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; $validator = Validator::make($request->all(), [ 'companies.*.id' => Rule::forEach(function ($value, $attribute) { return [ Rule::exists(Company::class, 'id'), new HasPermission('manage-company', $value), ]; }), ]);

 

Laravel Breeze API & Next.js

A Laravel Breeze egy "API kezdőszett"-tel bővült, illetve Next.js frontend implementációval.

 

Megújult Ignition exception oldal

Megváltozott az Ignition, az Exception-ök és hibák esetén megjelenő debugging oldal.

Ignition exception page

 

Megújult route:list CLI output

A route:list Artisan parancs is megváltozott, így most már sokkal több részletet láthatunk.

Route listing

 

Lefedettség mérése teszteléskor

Mostantól mérhetünk lefedettséget is tesztelés esetén a --coverage opcióval (így a teljes parancs php artisan test --coverage).

Coverage testing

Emellett megadhatunk egy minimális lefedettségi szintet, amit muszáj elérnünk ahhoz, hogy sikeres legyen a teszt.

php artisan test --coverage --min=80

Minimum coverage level

 

Javult Collection IDE támogatás

Új definíciókat kapott a Collection class, így a kódszerkesztők mostantól könnyebben és részletesebben fogják érteni.

Improved Collection definitions

 

Új helperek

Két új helpert is kaptunk.

str

Az str() function egy Illuminate\Support\Stringable instance-t fog visszaadni, egy megadott string alapján. Ugyanúgy működik, mint az Str::of().

Ha nincs paraméter megadva, akkor viszont egy Illuminate\Support\Str instance-t kapunk vissza.

to_route

A to_route() function egy HTTP redirect response-t ad vissza, a megadott route-ra.

return to_route('users.show', ['user' => 1]);