Organiser sa configuration Laravel proprement
Sommaire
- Présentation
- Tutoriel vidéo
- Notre première classe Bootstrapper
- La configuration du routing
- Conclusion
Présentation
Depuis Laravel 11, chaque nouveau projet trouve un ensemble de configurations dans son fichier bootstrap/app.php
.
Cette configuration inclue celle du routing, des middlewares et du gestionnaire d’exceptions entre autre.
Le fichier bootstrap/app.php
peut ainsi facilement devenir gonflé à bloc avec de nombreuses configurations.
Une solution qui s’offre à nous serait l’utilisation des bootstrappers. Un ensemble de classes invokables qui s’occuperont d’initialiser les configurations désirées.
Tutoriel vidéo
Notre première classe Bootstrapper
Je vais illustrer ici un exemple avec les Middlewares, sachez que cela vaut pour le reste. (sauf le routing que l’on voit juste après !)
Voici à quoi ressemble ce fameux fichier bootstrap/app.php
:
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$middleware->redirectGuestsTo(fn () => route('register'));
$middleware->statefulApi();
$middleware->throttleApi();
$middleware->alias([
'hasRole' => EnsureUserHasRole::class,
]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})
->create();
L’idée est de remplacer le callable par une classe callable, et nous pouvons y parvenir via une classe invokable. Pour plus d’informations à ce sujet je vous renvoie sur la doc officielle de PHP.
Créons notre première classe Bootstrapper via la nouvelle commande :
php artisan make:class -i Bootstrappers/MiddlewareBootstrapper
Et déplaçons notre configuration à l’intérieur.
class MiddlewareBootstrapper
{
public function __invoke(Middleware $middleware): void
{
$middleware->redirectGuestsTo(fn () => route('register'));
$middleware->statefulApi();
$middleware->throttleApi();
$middleware->alias([
'hasRole' => EnsureUserHasRole::class,
]);
}
}
La configuration du routing
Pour la configuration du routing, il faudra invoquer manuellement la configuration voulu via la classe Router
du framework.
Nous pouvons user de la syntaxe du first-class callable pour arriver à faire quelque chose de propre.
use Illuminate\Routing\Router;
class RoutingBootstrapper
{
public function __invoke(Router $router): void
{
$router->middleware('web')
->group(base_path('routes/web.php'));
$router->middleware('api')
->prefix('api')
->group(base_path('routes/api.php'));
$router->middleware('web')
->group(base_path('routes/console.php'));
$router->middleware('web')
->get('/up', function () {
Event::dispatch(new DiagnosingHealth);
return View::file(base_path('/vendor/laravel/framework/src/Illuminate/Foundation/resources/health-up.blade.php'));
});
}
}
Et voilà notre fichier bootstrap/app.php
tout propre ! 🧽
return Application::configure(basePath: dirname(__DIR__))
->withRouting((new RoutingBootstrapper)(...))
->withMiddleware(new MiddlewareBootstrapper)
->withExceptions(new ExceptionsBootstrapper)
->create();
Conclusion
Ouf, nous avons encore survécu à un potentiel code bordélique. Félicitations et mission accomplie !
N’hésitez pas à me suivre et à vous abonner à Laravel Jutsu pour plus de contenu !