Retour au blog
Organiser son fichier bootstrap/app.php

Organiser sa configuration Laravel proprement

Sommaire

  1. Présentation
  2. Tutoriel vidéo
  3. Notre première classe Bootstrapper
  4. La configuration du routing
  5. 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 !