在您的 Laravel 应用程序中使用路由注册器

发布于 作者

Using Route Registrars in your Laravel application image

最近我发现了一种在 Laravel 应用程序中加载路由的独特方法,我想与大家分享。它允许您创建路由注册器类,并在其中注册您的路由。我在 Ollie Read 开发的一个软件包中看到了这一点,它引起了我的注意,因为它是一种干净且令人兴奋的路由注册方式。

您对标准 Laravel 应用程序所做的更改相对简单。我们对路由服务提供商进行了一些更改,并删除了 web 和 API 路由文件。我们首先创建一个新特性/关注点,可以添加到我们的 app/Providers/RouteServiceProvider 中,名为 MapRouteRegistrars。将以下代码添加到这个新的特性/关注点中。

declare(strict_types=1);
 
namespace App\Routing\Concerns;
 
use App\Routing\Contracts\RouteRegistrar;
use Illuminate\Contracts\Routing\Registrar;
use RuntimeException;
 
trait MapRouteRegistrars
{
protected function mapRoutes(Registrar $router, array $registrars): void
{
foreach ($registrars as $registrar) {
if (! class_exists($registrar) || ! is_subclass_of($registrar, RouteRegistrar::class)) {
throw new RuntimeException(sprintf(
'Cannot map routes \'%s\', it is not a valid routes class',
$registrar
));
}
 
(new $registrar)->map($router);
}
}
}

如您所见,我们还需要创建一个接口/契约以供使用,并确保我们所有的注册器都实现了它。在 app/Routing/Contracts/RouteRegistrar 下创建此接口,并添加以下代码。

declare(strict_types=1);
 
namespace App\Routing\Contracts;
 
use Illuminate\Contracts\Routing\Registrar;
 
interface RouteRegistrar
{
public function map(Registrar $registrar): void;
}

现在我们已经有了特性和接口,我们可以看看我们需要对默认路由服务提供商进行的更改。

declare(strict_types=1);
 
namespace App\Providers;
 
use App\Routing\Concerns\MapsRouteRegistrars;
use Illuminate\Contracts\Routing\Registrar;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
 
class RouteServiceProvider extends ServiceProvider
{
use MapsRouteRegistrars;
 
protected array $registrars = [];
 
public function boot(): void
{
$this->routes(function (Registrar $router) {
$this->mapRoutes($router, $this->registrars);
});
}
}

从上面的代码中,您可以看到我们在路由服务提供商中添加了一个新属性。此属性用于在 boot 方法中注册和加载应用程序的路由注册器。

现在我们已经准备好使用路由注册器来代替路由文件,让我们为我们的应用程序创建一个默认的路由注册器。这种方法在领域驱动设计或模块化系统中非常有效 - 允许每个领域或模块注册其路由。在本例中,我们将保持简单,以便您可以理解这种方法。在 app/Routing/Registrars/DefaultRegistrar.php 中创建一个新的路由注册器,并添加以下代码。

declare(strict_types=1);
 
namespace App\Routing\Registrars;
 
use App\Routing\Contracts\RouteRegistrar;
 
class DefaultRegistrar implements RouteRegistrar
{
public function map(Registrar $registrar): void
{
$registrar->view('/', 'welcome');
}
}

现在我们的默认注册器已经创建,我们可以在我们的路由服务提供商中注册它,确保它被加载。

declare(strict_types=1);
 
namespace App\Providers;
 
use App\Routing\Concerns\MapsRouteRegistrars;
use App\Routing\Registrars\DefaultRegistrar;
use Illuminate\Contracts\Routing\Registrar;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
 
class RouteServiceProvider extends ServiceProvider
{
use MapsRouteRegistrars;
 
protected array $registrars = [
DefaultRegistrar::class,
];
 
public function boot(): void
{
$this->routes(function (Registrar $router) {
$this->mapRoutes($router, $this->registrars);
});
}
}

现在,如果您访问 /,您将加载 welcome 视图,这意味着一切都已正确连接。我可以想象在我的应用程序中使用它的一个好方法,其中我有静态营销路由、博客路由、管理员路由等等。例如,我可能会想象路由服务提供商看起来像这样

declare(strict_types=1);
 
namespace App\Providers;
 
use App\Routing\Concerns\MapsRouteRegistrars;
use App\Routing\Registrars\AdminRegistrar;
use App\Routing\Registrars\BlogRegistrar;
use App\Routing\Registrars\MarketingRegistrar;
use Illuminate\Contracts\Routing\Registrar;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
 
class RouteServiceProvider extends ServiceProvider
{
use MapsRouteRegistrars;
 
protected array $registrars = [
MarketingRegistrar::class, // Marketing Routes
BlogRegistrar::class, // Blog Routes
AdminRegistrar::class, // Admin Routes
];
 
public function boot(): void
{
$this->routes(function (Registrar $router) {
$this->mapRoutes($router, $this->registrars);
});
}
}

像这样拆分路由是将标准 PHP 路由文件迁移到基于类的路由系统的好方法,这样可以更好地封装您的应用程序或领域。

您还发现了哪些其他方法来帮助您管理不断增长的应用程序?尤其是从路由的角度来看,它们一段时间后会变得有点难以控制。请在 Twitter 上告诉我们。

Steve McDougall photo

Laravel 新闻 的技术作家,Treblle 的开发者倡导者。API 专家,资深 PHP/Laravel 工程师。YouTube 直播主

Cube

Laravel 新闻稿

加入 40k+ 其他开发者,绝不错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动补全和本地和生产环境的即时反馈进行调试。

Tinkerwell
No Compromises logo

绝不妥协

Joel 和 Aaron,两位来自“绝不妥协”播客的经验丰富的开发人员,现在可以为您的 Laravel 项目聘用。⬧ 固定费率 7500 美元/月。⬧ 无需冗长的销售流程。⬧ 无需签订合同。⬧ 100% 退款保证。

绝不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?立即使用自动化的 Laravel 升级和代码现代化,使您的应用程序保持新鲜感。

Shift
Bacancy logo

Bacancy

使用经验丰富的 Laravel 开发人员(具有 4-6 年经验)为您的项目增效,每月仅需 2500 美元。获得 160 小时的专业知识和 15 天的无风险试用。立即安排电话会议!

Bacancy
Lucky Media logo

Lucky Media

立即获得幸运 - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带到 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 招聘网站

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。支付、漂亮的结账、管理面板、用户仪表板、身份验证、现成组件、统计数据、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝 Laravel 升级、降低成本和加速创新的合作伙伴,为成功公司提供服务

Rector
MongoDB logo

MongoDB

使用 MongoDB 和 Laravel 的强大集成来增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务性、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活、现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的无依赖性输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 软件包将评论添加到您的 Laravel 应用程序

阅读文章