Laravel 9 - újdonságok röviden
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.
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.
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.
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
).
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
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.
Ú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]);