Laravel v9 sera la prochaine version LTS de Laravel, et elle sortira dans le courant du mois de février 2022. Dans cet article, nous avons voulu présenter toutes les nouvelles fonctionnalités et les changements annoncés jusqu’à présent.
Changements dans la date de sortie de Laravel 9
La sortie de Laravel v9 était prévue pour septembre de cette année, mais l’équipe Laravel a décidé de repousser cette version à février 2022 :
Laravel utilise une variété de paquets gérés par la communauté ainsi que neuf composants Symfony pour un certain nombre de fonctionnalités du framework. La sortie de Symfony 6.0 est prévue en novembre. Pour cette raison, nous avons choisi de retarder la sortie de Laravel 9.0 jusqu’en 2022.
En retardant la sortie, nous pouvons mettre à niveau nos composants Symfony sous-jacents vers Symfony 6.0 sans être obligés d’attendre septembre 2022 pour effectuer cette mise à niveau. En outre, cela nous permet de mieux nous positionner pour les futures versions, car nos versions annuelles auront toujours lieu deux mois après celles de Symfony.
Cela repoussera également les prochaines versions majeures, et voici le calendrier pour l’avenir :
- Laravel 9 : 8 février 2022
- Laravel 10 : 7 février 2023
PHP 8 la version minimale dans Laravel 9
Puisque Laravel 9 nécessitera Symfony 6.0 et qu’il a une exigence minimale de PHP 8, cela signifie que Laravel 9 aura la même restriction.
Nouveau design pour routes:list
La commande routes:list est incluse dans Laravel depuis longtemps maintenant, et un problème qui se pose parfois est que si vous avez défini des routes énormes et complexes, il peut être difficile de les afficher dans la console. Grâce à une pull request de Nuno Maduro, cette commande est en train de faire peau neuve.
Nouvelle option de test –coverage
Une nouvelle option artisan test –coverage permet d’afficher la couverture de code du test directement sur le terminal. Il comprend également une option –min que vous pouvez utiliser pour indiquer l’application du seuil minimum pour la couverture.
Migrations de stub anonymes
Au début de l’année, la version 8.37 de Laravel a été dotée d’une nouvelle fonctionnalité appelée « Migrations anonymes », qui permet d’éviter les collisions entre les noms de classes de migration.
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration {
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('people', function (Blueprint $table) {
$table->string('first_name')->nullable();
});
}
};
Au lancement de Laravel 9, ce sera la valeur par défaut lorsque vous exécuterez php artisan make:migration
.
Nouvelle interface de création de requêtes
Grâce à Chris Morrell, Laravel 9 disposera d’une nouvelle interface de création de requêtes.
Pour les développeurs qui s’appuient sur les indications de type pour l’analyse statique, le refactoring ou la complétion de code dans leur IDE, l’absence d’interface partagée ou d’héritage entre Query\Builder, Eloquent\Builder et Eloquent\Relation peut être assez délicate :
return Model::query()
->whereNotExists(function($query) {
// $query est un Query\Builder
})
->whereHas('relation', function($query) {
// $query est un Eloquent\Builder
})
->with('relation', function($query) {
// $query est un Eloquent\Relation
});
Cette fonctionnalité ajoute une nouvelle interface Illuminate\Contracts\Database\QueryBuilder et un trait Illuminate\Database\Eloquent\Concerns\DecoratesQueryBuilder qui implémente l’interface à la place de l’implémentation __call existante.
Fonctions des chaînes de caractères en PHP 8
Comme PHP 8 sera le minimum, Tom Schlick a soumis un PR pour passer à l’utilisation des fonctions str_contains(), str_starts_with() et str_ends_with() en interne dans la classe \Illuminate\Support\Str.
De SwiftMailer à Symfony Mailer
Le support de Symfony Mailer a été fourni par Dries Vints, James Brooks et Julius Kiekbusch.
Les versions précédentes de Laravel utilisaient la bibliothèque Swift Mailer pour envoyer des e-mails sortants. Cependant, cette bibliothèque n’est plus maintenue et a été remplacée par Symfony Mailer.
Flysystem 3.x
Le support de Flysystem 3.x a été fourni par Dries Vints.
Laravel 9.x met à niveau notre dépendance amont Flysystem vers Flysystem 3.x. Flysystem gère toutes les interactions avec le système de fichiers offertes par la façade Storage.
Amélioration des accesseurs/mutateurs éloquents
Amélioration des accesseurs / mutateurs Eloquent a été contribué par Taylor Otwell.
Laravel 9.x offre une nouvelle façon de définir les accesseurs et mutateurs Eloquent. Dans les versions précédentes de Laravel, la seule façon de définir les accesseurs et les mutateurs était de définir des méthodes préfixées sur votre modèle comme ceci :
public function getNameAttribute($value)
{
return strtoupper($value);
}
public function setNameAttribute($value)
{
$this->attributes['name'] = $value;
}
Illuminate\Database\Eloquent\Casts\Attribute
:use Illuminate\Database\Eloquent\Casts\Attribute;
public function name(): Attribute
{
return new Attribute(
get: fn ($value) => strtoupper($value),
set: fn ($value) => $value,
);
}
En outre, cette nouvelle approche de la définition des accesseurs permettra de mettre en cache les valeurs des objets qui sont renvoyées par l’attribut
use App\Support\Address;
use Illuminate\Database\Eloquent\Casts\Attribute;
public function address(): Attribute
{
return new Attribute(
get: fn ($value, $attributes) => new Address(
$attributes['address_line_one'],
$attributes['address_line_two'],
),
set: fn (Address $value) => [
'address_line_one' => $value->lineOne,
'address_line_two' => $value->lineTwo,
],
);
}
Implicit Route Bindings With Enums
PHP 8.1 introduit le support de Enums. Laravel 9.x introduit la possibilité de taper une Enum sur votre définition de route et Laravel n’invoquera la route que si ce segment de route est une valeur Enum valide dans l’URI. Sinon, une réponse HTTP 404 sera renvoyée automatiquement. Par exemple, avec l’Enum suivante :
enum Category: string
{
case Fruits = 'fruits';
case People = 'people';
}
Vous pouvez définir une route qui ne sera invoquée que si le segment de route {category}
est fruits
ou people
. Sinon, une réponse HTTP 404 sera renvoyée :
Route::get('/categories/{category}', function (Category $category) {
return $category->value;
});
Groupes de routes du contrôleur
Vous pouvez maintenant utiliser la méthode controller
pour définir le contrôleur commun à toutes les routes du groupe. Ensuite, lorsque vous définissez les itinéraires, il vous suffit de fournir la méthode du contrôleur qu’ils invoquent :
use App\Http\Controllers\OrderController;
Route::controller(OrderController::class)->group(function () {
Route::get('/orders/{id}', 'show');
Route::post('/orders', 'store');
});
Casting d’attributs éloquents Enum
Le casting d’Enum n’est disponible que pour PHP 8.1+.
Eloquent now allows you to cast your attribute values to PHP enums. Pour ce faire, vous pouvez spécifier l’attribut et l’enum que vous souhaitez convertir dans le tableau de propriétés $casts de votre modèle :
use App\Enums\ServerStatus;
/**
* The attributes that should be cast.
*
* @var array
*/
protected $casts = [
'status' => ServerStatus::class,
];
Une fois que vous avez défini le cast sur votre modèle, l’attribut spécifié sera automatiquement converti en un enum lorsque vous interagirez avec cet attribut :
ServerStatus::provisioned) {
$server->status = ServerStatus::ready;
$server->save();
}
Forced Scoped Bindings
Dans les versions précédentes de Laravel, vous pouvez souhaiter étendre le second modèle Eloquent dans une définition de route de sorte qu’il soit un enfant du modèle Eloquent précédent. Par exemple, considérez cette définition de route qui récupère un article de blog par slug pour un utilisateur spécifique :
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post:slug}', function (User $user, Post $post) {
return $post;
});
Lors de l’utilisation d’une liaison implicite à clé personnalisée comme paramètre de route imbriquée, Laravel étend automatiquement la requête pour récupérer le modèle imbriqué par son parent en utilisant des conventions pour deviner le nom de la relation sur le parent. Cependant, ce comportement n’était auparavant pris en charge par Laravel que lorsqu’une clé personnalisée était utilisée pour la liaison de la route enfant.
Cependant, dans Laravel 9.x, vous pouvez maintenant demander à Laravel de mettre en place des liaisons « enfants » même si une clé personnalisée n’est pas fournie. Pour ce faire, vous pouvez invoquer la méthode scopeBindings lors de la définition de votre route :
use App\Models\Post;
use App\Models\User;
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
})->scopeBindings();
Vous pouvez également demander à un groupe entier de définitions d’itinéraires d’utiliser des liaisons scopées :
Route::scopeBindings()->group(function () {
Route::get('/users/{user}/posts/{post}', function (User $user, Post $post) {
return $post;
});
});
Laravel Breeze API & Next.js
Le kit de démarrage Laravel Breeze a reçu un mode d’échafaudage « API » et une implémentation front Next.js complémentaire. Ce kit de démarrage peut être utilisé pour faire démarrer vos applications Laravel qui servent de backend, d’API authentifiée Laravel Sanctum pour un frontend JavaScript.
Moteur de base de données Laravel Scout
Si votre application interagit avec des bases de données de taille petite à moyenne ou a une charge de travail légère, vous pouvez maintenant utiliser le moteur de « base de données » de Scout au lieu d’un service de recherche dédié comme Algolia ou MeiliSerach. Le moteur de base de données utilisera les clauses « where like » et les index plein texte lors du filtrage des résultats de votre base de données existante pour déterminer les résultats de recherche applicables à votre requête.
Index en texte intégral / Clauses d’exclusion
Lors de l’utilisation de MySQL ou PostgreSQL, la méthode fullText
peut désormais être ajoutée aux définitions de colonnes pour générer des index full text
$table->text('bio')->fullText();
En outre, les méthodes whereFullText et orWhereFullText peuvent être utilisées pour ajouter des clauses « where » en texte intégral à une requête pour les colonnes qui ont des index en texte intégral. Ces méthodes seront transformées par Laravel en SQL approprié pour le système de base de données sous-jacent. Par exemple, une clause MATCH AGAINST sera générée pour les applications utilisant MySQL :
$users = DB::table('users')
->whereFullText('bio', 'web developer')
->get();
Rendu inline des modèles Blade
Parfois, vous pouvez avoir besoin de transformer une chaîne brute de modèle Blade en HTML valide. Vous pouvez accomplir cela en utilisant la méthode de rendu fournie par la façade Blade. La méthode de rendu accepte la chaîne du modèle Blade et un tableau optionnel de données à fournir au modèle :
use Illuminate\Support\Facades\Blade;
return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);
Soketi Echo Server
Bien que n’étant pas exclusif à Laravel 9.x, Laravel a récemment aidé à la documentation de Soketi, un serveur Web Socket compatible avec Laravel Echo écrit pour Node.js. Soketi constitue une excellente alternative open source à Pusher et Ably pour les applications qui préfèrent gérer leur propre serveur Web Socket.
Bootstrap 5 Pagination
Laravel inclut désormais des vues de pagination construites à l’aide de Bootstrap 5. Pour utiliser ces vues à la place des vues par défaut de Tailwind, vous pouvez appeler la méthode useBootstrapFive du paginateur dans la méthode de démarrage de votre classe App\Providers\AppServiceProvider:
use Illuminate\Pagination\Paginator;
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
Paginator::useBootstrapFive();
}
Page d’exception améliorée
La page de débogage d’exception open source créée par Spatie, a été repensée de fond en comble. La nouvelle version améliorée d’Exception est compatible avec Laravel 9.x et comprend des thèmes clairs et foncés, une fonctionnalité personnalisable d’ouverture dans l’éditeur, etc.
Nouvelle fonctions Helpers
Laravel 9.x introduit deux nouvelles fonctions helpers pratiques que vous pouvez utiliser dans votre propre application.
str
La fonction str renvoie une nouvelle instance de Illuminate\Support\Stringable pour la chaîne de caractères donnée. Cette fonction est équivalente à la méthode Str::of
$string = str('Taylor')->append(' Otwell');
// 'Taylor Otwell'
Si aucun argument n’est fourni à la fonction str, la fonction renvoie une instance de Illuminate\Support\Str :
$snake = str()->snake('LaravelFramework');
// 'laravel_framework'
to_route
La fonction to_route génère une réponse HTTP de redirection pour une route nommée donnée, fournissant un moyen expressif de rediriger vers des routes nommées à partir de vos routes et contrôleurs :
return to_route('users.show', ['user' => 1]) ;
Si nécessaire, vous pouvez transmettre le code d’état HTTP qui doit être attribué à la redirection et tout en-tête de réponse supplémentaire comme troisième et quatrième arguments de la méthode to_route :
return to_route('users.show', ['user' => 1], 302, ['X-Framework' => 'Laravel']);
Le fichier server.php peut être supprimé
Une fonctionnalité mineure mais vous pouvez maintenant supprimer le fichier server
de votre projet et il sera inclus à l’intérieur du framework. Ce fichier est uniquement utilisé pour le service php artisan.
Et plus encore…
Laravel 9 est encore dans quelques mois, et d’autres nouvelles fonctionnalités et annonces vont arriver. Nous mettrons à jour ce post au fur et à mesure que celles-ci seront annoncées. Vous pouvez également consulter la page de sortie officielle