
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.
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.
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.
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.
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.
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:
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.


