Dans cet article, je vous explique comment déclarer proprement vos routes en passant par la création d’une classe Route Registrers dans lesquelles vous enregistrez vos routes. C’est un moyen propre et facile pour déclarer les routes.
Les modifications à apporter à votre application Laravel sont relativement simples. Nous apportons quelques modifications au fournisseur de service de route et supprimons les fichiers de route Web et API. La première chose que nous faisons est de créer un nouveau trait/concern que nous pouvons ajouter à notre app/Providers/RouteServiceProvider appelé MapRouteRegistrers. Ajoutez le code suivant à ce nouveau trait/concern.
namespace App\Routing\Concerns;
use App\Routing\Contracts\RouteRegistrer;
use Illuminate\Contracts\Routing\Registrer;
use RuntimeException;
trait MapRouteRegistrers
{
protected function mapRoutes(Registrer $router, array $registrers): void
{
foreach ($registrers as $registrer) {
if (! class_exists($registrer) || ! is_subclass_of($registrer, RouteRegistrer::class)) {
throw new RuntimeException(sprintf(
'Cannot map routes \'%s\', it is not a valid routes class',
$registrer
));
}
(new $registrer)->map($router);
}
}
}
Comme vous pouvez le constater, nous devons également créer une interface/contrat à utiliser et nous assurer que tous nos Registrers l’implémentent.
Créez-la sous App/Routing/Contracts/RouteRegistrer et ajoutez le code suivant.
namespace App\Routing\Contracts;
use Illuminate\Contracts\Routing\Registrer;
interface RouteRegistrer
{
public function map(Registrer $registrer): void;
}
Maintenant que le trait et l’interface sont en place, nous pouvons examiner les changements que nous devons apporter au fournisseur de services de routage par défaut.
namespace App\Providers;
use App\Routing\Concerns\MapsRouteRegistrers;
use Illuminate\Contracts\Routing\Registrer;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
use MapsRouteRegistrers;
protected array $registrers = [];
public function boot(): void
{
$this->routes(function (Registrer $router) {
$this->mapRoutes($router, $this->registrers);
});
}
}
Dans le code ci-dessus, vous pouvez voir que nous avons ajouté une nouvelle propriété à notre fournisseur de service de route. Cette propriété est l’endroit où les registres de route de l’application sont enregistrés et chargés dans la méthode de démarrage.
Maintenant que notre application est prête à utiliser des registres de route au lieu de fichiers de route, créons-en un par défaut pour notre application. Cette approche fonctionnerait exceptionnellement bien dans un système modulaire ou une conception orientée domaine – permettant à chaque domaine ou module d’enregistrer ses routes. Pour cet exemple, nous allons rester simples afin que vous puissiez comprendre l’approche. Créez un nouveau registre de routes dans app/Routing/Registrers/DefaultRegistrer.php et ajoutez le code suivant.
namespace App\Routing\Registrers;
use App\Routing\Contracts\RouteRegistrer;
class DefaultRegistrer implements RouteRegistrer
{
public function map(Registrer $registrer): void
{
$registrer->view('/', 'welcome');
}
}
Maintenant que notre registrer par défaut est créé, nous pouvons l’enregistrer dans notre Route Service Provider, en nous assurant qu’il est chargé.
namespace App\Providers;
use App\Routing\Concerns\MapsRouteRegistrers;
use App\Routing\Registrers\DefaultRegistrer;
use Illuminate\Contracts\Routing\Registrer;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
use MapsRouteRegistrers;
protected array $registrers = [
DefaultRegistrer::class,
];
public function boot(): void
{
$this->routes(function (Registrer $router) {
$this->mapRoutes($router, $this->registrers);
});
}
}
Maintenant, si vous visitez « / », vous serez chargé avec la vue de « welcome », ce qui signifie que tout est correctement connecté. Dans mon exemple, j’ai des routes statiques de marketing, de blog, d’administration, etc :
namespace App\Providers;
use App\Routing\Concerns\MapsRouteRegistrers;
use App\Routing\Registrers\AdminRegistrer;
use App\Routing\Registrers\BlogRegistrer;
use App\Routing\Registrers\MarketingRegistrer;
use Illuminate\Contracts\Routing\Registrer;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
class RouteServiceProvider extends ServiceProvider
{
use MapsRouteRegistrers;
protected array $registrers = [
MarketingRegistrer::class, // Marketing Routes
BlogRegistrer::class, // Blog Routes
AdminRegistrer::class, // Admin Routes
];
public function boot(): void
{
$this->routes(function (Registrer $router) {
$this->mapRoutes($router, $this->registrers);
});
}
}
Diviser nos routes de cette manière est un excellent moyen de passer d’un fichier de routes PHP standard à un système de routage basé sur des classes, ce qui permet une meilleure encapsulation avec votre application ou domaine.