Dichiarare le route di Laravel con classi route registrar

Dichiarare le route di Laravel con classi route registrar

In questo articolo ti spiego come dichiarare le route in modo pulito, creando una classe Route Registrers in cui registrarle. È un modo ordinato e semplice per dichiararle.

Le modifiche da apportare alla tua applicazione Laravel sono piuttosto contenute. Interveniamo un po’ sul service provider delle route ed eliminiamo i file di route web e API. La prima cosa da fare è creare un nuovo trait/concern da aggiungere al nostro app/Providers/RouteServiceProvider, chiamato MapRouteRegistrers. Aggiungi il codice seguente a questo nuovo trait/concern.

php
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);
		}
	}
}

Come vedi, dobbiamo anche creare un’interfaccia/contratto da usare e assicurarci che tutti i nostri Registrers la implementino.

Creala in App/Routing/Contracts/RouteRegistrer e aggiungi il codice seguente.

php
namespace App\Routing\Contracts;

use Illuminate\Contracts\Routing\Registrer;

interface RouteRegistrer
{
	public function map(Registrer $registrer): void;
}

Ora che il trait e l’interfaccia sono al loro posto, possiamo vedere le modifiche da applicare al service provider di routing predefinito.

php
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);
		});
	}
}

Nel codice qui sopra puoi vedere che abbiamo aggiunto una nuova proprietà al nostro service provider delle route. In quella proprietà vengono registrati i route registrar dell’applicazione, che poi vengono caricati nel metodo di avvio.

Ora che l’applicazione è pronta a usare i route registrar al posto dei file di route, creiamone uno predefinito. Questo approccio funziona particolarmente bene in un sistema modulare o in una progettazione orientata al dominio, perché permette a ogni dominio o modulo di registrare le proprie route. Per questo esempio restiamo sul semplice, così da farti cogliere bene l’approccio. Crea un nuovo route registrar in app/Routing/Registrers/DefaultRegistrer.php e aggiungi il codice seguente.

php
namespace App\Routing\Registrers;

use App\Routing\Contracts\RouteRegistrer;

class DefaultRegistrer implements RouteRegistrer
{
	public function map(Registrer $registrer): void
	{
		$registrer->view('/', 'welcome');
	}
}

Ora che il nostro registrar predefinito è pronto, possiamo dichiararlo nel Route Service Provider, assicurandoci che venga caricato.

php
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);
		});
	}
}

A questo punto, se visiti «/», ti verrà caricata la vista «welcome», il che significa che è tutto collegato correttamente. Nel mio esempio ho route statiche di marketing, di blog, di amministrazione e così via:

php
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, // Route di marketing
		BlogRegistrer::class, // Route del blog
		AdminRegistrer::class, // Route di amministrazione
	];

public function boot(): void
	{
		$this->routes(function (Registrer $router) {
			$this->mapRoutes($router, $this->registrers);
		});
	}
}

Suddividere le route in questo modo è un ottimo modo per passare da un file di route PHP standard a un sistema di routing basato su classi, con un incapsulamento migliore all’interno della tua applicazione o del tuo dominio.

LaravelPHP

Damien Flandrin Sviluppatore web dal 2010, creatore di Gekkode e di Email Impact. Ogni articolo è testato su un progetto reale prima della pubblicazione. Contatti
Newsletter

I nuovi test, tutorial e progetti, via e-mail.

Test riproducibili, codice versionato, risultati datati. Mai spam.