Laravel 10: nieuwe major release
Zoals sommige van jullie al weten, is er sinds vorig jaar bekend gemaakt dat er niet meer zal gewerkt worden met LTS (long term support) releases maar met jaarlijkse major version bumps. Na een jaar actieve development aan Laravel 10 en actieve support op Laravel 9 staat de release eindelijk in de startblokken. In deze release zijn toch heel wat structurele aanpassingen gebeurd. Om een kleine tip te geven, op Twitter en Reddit hebben vele enthousiastelingen L10 al gedoopt tot: The king of types.
Artisan wordt interactiever
Vanaf Laravel 10 wordt Artisan interactiever. Stel dat je vraagt om een model te maken, maar je vergeet de naam door te geven:
1
php artisan make:model
In plaats van een foutmelding te geven, zal Artisan je gewoon de naam van het model vragen, maar ook of je een migratie, een factory, e.d. wilt maken. Heel handig!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
php artisan make:model
What should the model be named?
❯ Post
Would you like any of the following? [none]
none ......................................................................................... 0
all .......................................................................................... 1
factory ...................................................................................... 2
form requests ................................................................................ 3
migration .................................................................................... 4
policy ....................................................................................... 5
resource controller .......................................................................... 6
seed ......................................................................................... 7
Is jouw applicatie up-to-date?
Een up-to-date applicatie geeft je niet alleen de nieuwste functies en verbeteringen, maar zorgt o.a. ook voor maximalisatie van de veiligheid en de prestaties.
Het Laravel 10 skelet gebruikt native types in plaats van docblocks
Vanaf Laravel 10 zal het skelet native types gebruiken in plaats van docblocks.
Het team heeft ook generieke type annotaties toegevoegd, wat de auto-completion ook bij het coderen drastisch zal verbeteren (als je code-editor generieke annotaties ondersteunt).
Zie de PR op GitHub: [10.x] Gebruikt PHP Native Type Declarations 🐘
Bijvoorbeeld, in het Laravel skelet zal de schedule() methode in app/Console/Kernel.php er zo uitzien 🤩
Officiële packages zullen ook native types gebruiken
Eigenlijk hoef je niet te wachten tot Laravel 10 om te genieten van native type hints in officiële Laravel packages. Het Laravel core dev team was dit al doorheen het jaar mee aan het integreren, wat zeker al zijn vruchten heeft afgeworpen:
Geen ondersteuning meer voor PHP 8.0
Als Laravel 10 ondersteuning voor PHP 8.0 laat vallen en minimaal 8.1 vereist, betekent dat twee dingen als je wilt upgraden:
Ofwel overschakelen naar PHP 8.1
Of PHP 8.2
Waarom laten ze PHP 8.0 support nu al vallen? PHP 8.0 is sinds 26 Nov 2022 niet meer in Active support, en valt dus nu enkel nog onder Security fixes. Aangezien dat er ook niet meer met LTS versies gewerkt wordt, is de visie vanuit Laravel dat ze zo goed mogelijk mee gaan met de technologie die er nu in de community aanwezig is. Blijven hangen op PHP 8.0 zou daarom ook niet passen bij hun nieuwe visie.
Je kan de pull request terug vinden op GitHub: [10.x] Drop PHP 8.0
Doctrine/dbal is niet meer nodig om kolommen in migraties te wijzigen
In een poging om de noodzaak voor doctrine/dbal package te elimineren bij het gebruik van change() om kolommen te wijzigen, komt er een nieuwe functie naar Laravel 10. Deze functie zal ontwikkelaars in staat stellen om de change() methode te gebruiken en kolommen op MySQL, PostgreSQL, en SQL Server te wijzigen zonder de noodzaak van een extra packages. Dit is een belangrijke en risicovolle verandering, maar we geloven wel dat het de moeite waard is.
Om de nieuwe functie beter te begrijpen, zie dit voorbeeld:
1
2
3
$table->integer('user_balance')->unsigned()->default(0);
// `user_balance` is een integer, unsigned, met een standaard waarde '0'.
Nu gaan we ervan uit dat we een kolom hebben voor user_balance en dat we het type ervan willen veranderen. Vanaf Laravel 10 kunnen we dit eenvoudig doen:
1
2
3
$table->bigInteger('user_balance')->change();
// Dit verandert `user_balance` naar een bigInteger in de de plaats van een integer
De bovenstaande code verandert met succes het type van de kolom, maar laat ook de attributen UNSIGNED en DEFAULT vallen. Daarom is het belangrijk dat je niet vergeet alle attributen toe te voegen wanneer je het type van een kolom wijzigt:
1
$table->bigInteger('user_balance')->unsigned()->default(0)->change();
In het geval dat je meerdere databaseverbindingen hebt en doctrine/dbal al hebt geïnstalleerd, is het aan te raden om de Schema::useNativeSchemaOperationsIfPossible() methode aan te roepen binnen de boot methode in App\ProvidersAppServiceProvider om native schema operations te kunnen gebruiken en om native operations te gebruiken voordat je vertrouwt op de package (SQLite ondersteunt dit bijvoorbeeld nog niet):
1
2
3
4
5
6
7
8
9
use IlluminateSupportFacadesSchema;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
Schema::useNativeSchemaOperationsIfPossible();
}
}
Kolom types opvragen
Een andere opmerkelijke eigenschap van Laravel 10 is de mogelijkheid om de Schema::getColumnType methode te gebruiken zonder afhankelijk te zijn van het doctrine/dbal pakket. Momenteel gebruiken we Schema::getColumnType met doctrine/dbal om het kolomtype te verkrijgen. Doctrine/dbal koppelt elk native kolomtype aan zijn doctrine/dbal type equivalent, en het ondersteunt niet veel van de kolomtypes gebruikt door Laravel in verschillende databases.
In Laravel 10 daarentegen geeft de nieuwe methode Schema::getColumnType het werkelijke kolomtype terug in plaats van het doctrine/dbal-equivalent. Hiermee kunt u ook integratietests schrijven voor de nieuwe native kolomwijzigingsfunctie. Je kan deze functie gebruiken om de naam van het gegevenstype of de gehele typedefinitie van de gespecificeerde kolom te verkrijgen:
Deprecations van Laravel 9
Methodes die in Laravel 9 stonden gemarkeerd als deprecated zullen zijn verwijderd in Laravel 10. De upgrade guide die je kan terug vinden in de documentatie bevat een lijst met de afgeschreven methodes en de potentiële gevolgen.
Hier zijn enkele deprecations die we hebben terug gevonden:
- Verwijderen van verschillende deprecations PR #41136
- Verwijderen van deprecated date properties PR #41136
- Verwijderen van de
handleDeprecation
methode PR #42590
Verwijderen van de assertTimesSent methode PR #42592
Verwijderen van de ScheduleListCommand's $defaulName property Diff 419471e
Verwijderen van de deprecated methode Route::home PR #42614
Verwijderen van deprecated dispatchNow functionaliteit PR 42591
Zelf ook aan het denken aan digitalisatie?
Bij Codana kan je terecht met al je vragen en samen werken we een plan uit met een duurzame blik op de toekomst!
Laravel Pennant - Feature flag systeem
Laravel Pennant is een package dat gepubliceerd is door het Laravel team samen met de release van Laravel 10. Pennant maakt het mogelijk om vanaf L10 met feature flags te werken zonder externe packages van community contributors.
Je kan Laravel Pennant heel gemakkelijk installeren met composer:
1
composer require laravel/pennant
Om een kort voorbeeld te geven van de werking van feature flags, je kan een functionaliteit alleen inzetten voor een selecte groep gebruikers in uw productieomgeving. Dit is geweldig voor bijvoorbeeld A/B-tests.
1
2
3
4
5
6
use Laravel\Pennant\Feature;
use Illuminate\Support\Lottery;
Feature::define('nieuwe-coupon-bestellings-flow', function () {
return Lotterij::odds(1, 10);
});
Controleer of de gebruiker toegang heeft tot de functie:
1
2
3
if (Feature::active('nieuwe-coupon-bestellings-flow')) {
//
}
Er is zelfs een Blade directive:
1
2
3
@feature('nieuwe-coupon-bestellings-flow')
…
@endfeature
Meer te weten komen over Laravel Pennant, neem een kijkje in de officiële documentatie.