Laravel 9

Marcus Olsson,

Det var länge sedan sist (17 månader!) – men nu är nästa stora version av Laravel här; Laravel 9.

Laravel 9 är den nya LTS (long term support)-versionen av Laravel och kommer att få bug fixes t.o.m. februari 2024 och säkerhetsuppdateringar fram till februari 2025. Så om man kör på nuvarande LTS versionen (Laravel 6) så kan det vara en idé att försöka uppgradera. Den tidigare versionen Laravel 8 kommer dock att motta säkerhetsuppdateringar fram till slutet av nästa år i alla fall.

Nytt i Laravel 9

Laravel 9 är en vidareutveckling av allt som är bra med Laravel; det mesta är det samma men med nya lager av polish och små funktioner som gör livet lättare för oss utvecklare.

Först och främst så krävs PHP 8 och uppåt, m.a.o. är PHP 7 inte längre kompatibelt med Laravel. För det andra så är flera underliggande paket uppdaterade eller utbytta, främst Flysystem som har gått från version 1 till 3, och hela Swiftmailer (var utveckling har stängt ner) är utbytt emot Symfony Mailer.

För kanske större/mer avancerade projekt som använder funktioner direkt ifrån de paketen kan ha en hel del jobb med att uppgradera framför sig.

Bland andra nyheter återfinns nya metoder för accessors/mutators; att man kan kombinera en getter och setter i samma funktion:

1// Laravel 8
2function setFirstNameAttribute($value)
3{
4 $this->attributes['first_name'] = strtolower($value);
5}
6 
7function getCustomAttribute($value)
8{
9 return ucfirst($value);
10}
11 
12// Laravel 9
13use Illuminate\Database\Eloquent\Casts\Attribute;
14 
15function firstName(): Attribute
16{
17 return new Attribute(
18 get: fn ($value) => ucfirst($value),
19 set: fn ($value) => strtolower($value),
20 );
21}
1// Laravel 8
2function setFirstNameAttribute($value)
3{
4 $this->attributes['first_name'] = strtolower($value);
5}
6 
7function getCustomAttribute($value)
8{
9 return ucfirst($value);
10}
11 
12// Laravel 9
13use Illuminate\Database\Eloquent\Casts\Attribute;
14 
15function firstName(): Attribute
16{
17 return new Attribute(
18 get: fn ($value) => ucfirst($value),
19 set: fn ($value) => strtolower($value),
20 );
21}

Ens routes-definitioner blir nu också mycket kraftfullare; t.ex. kan man definiera att modeller ska vara underordnade en annan model genom "forced scoped bindings".

I detta exemplet så körs en query på Post-modellen att de alltid ska tillhöra User-modellen:

1Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
2 return $post;
3})->scopeBindings();
1Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
2 return $post;
3})->scopeBindings();

Om man har relativt få controllers i ens applikation kan man nu också städa upp ordentligt genom "controller route groups";

1// Laravel 9
2Route::controller(OrderController::class)->group(function () {
3 Route::get('/orders/{id}', 'show');
4 Route::post('/orders', 'store');
5});
1// Laravel 9
2Route::controller(OrderController::class)->group(function () {
3 Route::get('/orders/{id}', 'show');
4 Route::post('/orders', 'store');
5});

Applikationen routar nu automatiskt /orders/{id} till OrderController::show(), man behöver alltså inte definiera hela sökvägen likt tidigare:

1// Laravel 8
2Route::group(function () {
3 Route::get('/orders/{id}', 'OrderController@show');
4 Route::post('/orders', 'OrderController@store');
5});
1// Laravel 8
2Route::group(function () {
3 Route::get('/orders/{id}', 'OrderController@show');
4 Route::post('/orders', 'OrderController@store');
5});

Spana igenom den officiella upgrade-guiden för att se allt som är nytt och hur det eventuellt påverkar dig/er.

Spana även Laravels webbplats som har fått en ny fin design genom Tailwind CSS, nu med syntax highlighting via Torchlight – något som även kommer dyka upp på denna webbplatsen när man väl får lite tid över.