rollerworks / route-autowiring-bundle
轻松在任何路由方案部分加载(自动绑定)路由
Requires
- php: ^7.2
- symfony/framework-bundle: ^5.0
Requires (Dev)
- matthiasnoback/symfony-dependency-injection-test: ^4.1.0
- phpunit/phpunit: ^8.4.3
- symfony/browser-kit: ^5.0
- symfony/expression-language: ^5.0
- symfony/phpunit-bridge: ^5.0
- symfony/property-access: ^5.0
- symfony/yaml: ^5.0
README
The RollerworksRouteAutowiringBundle 允许使用自动绑定系统导入多个路由集合。
例如,你有一个 BundleA,它定义了一些路由,要使用它们,你需要显式导入它们,但如果你删除/禁用该包,应用程序会崩溃,因为它找不到资源文件了。
当你自动启用它们时,你无法保持前缀的一致性。有时你可能不想启用所有路由集合。
它是如何工作的?
实际上,你像平常一样定义你的路由,但不是从文件或服务中导入它们,而是使用自动绑定系统加载它们。
需求
你需要至少 PHP 7.2 和 Symfony FrameworkBundle。
安装
打开命令行,进入你的项目目录,然后执行以下命令以下载此包的最新稳定版本
$ php composer.phar require rollerworks/route-autowiring-bundle
此命令需要你全局安装了 Composer,如 Composer 文档中的安装章节所述。
基本用法
此包有两个部分,注册和加载。
路由方案由“路由槽”保持,每次导入路由集合时都会自动注册。
注册路由以进行加载
假设你有一个名为 AcmeShopBundle
的包,具有以下路由集合
# Resources/config/routing/frontend.yml _products: resource: "routing/frontend/products.yml" prefix: /products _cart: resource: "routing/frontend/cart.yml" prefix: /cart
# Resources/config/routing/backend.yml _products: resource: "routing/backend/products.yml" prefix: /products
你可以使用以下片段导入它们
use Rollerworks\Bundle\RouteAutowiringBundle\RouteImporter; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; class AcmeShopExtension extends Extension { // ... public function load(array $configs, ContainerBuilder $container): void { // ... $routeImporter = new RouteImporter($container); $routeImporter->addObjectResource($this); $routeImporter->import('@AcmeShopBundle/Resources/config/routing/frontend.yml', 'frontend'); $routeImporter->import('@AcmeShopBundle/Resources/config/routing/backend.yml', 'backend'); } // ... }
@AcmeShopBundle/Resources/config/routing/frontend.yml
资源将导入(或注册)到 'frontend' 路由槽中。而 @AcmeShopBundle/Resources/config/routing/backend.yml
资源将导入到 'backend' 路由槽中。
注意
路由资源遵循与 Symfony 路由系统相同的逻辑,
@AcmeShopBundle
解析为 AcmeShopBundle 的完整路径。另请参阅:包括外部路由资源
提示:你可以在每个槽中导入多个路由资源 👍
$routeImporter->import('@AcmeShopBundle/Resources/config/routing/frontend.yml', 'frontend'); $routeImporter->import('@AcmeShopBundle/Resources/config/routing/extra.yml', 'frontend');
导入会尝试猜测正确的资源类型,但对于特殊类型(如服务),你需要提供第三个参数中的类型
$routeImporter->import('@AcmeShopBundle/Resources/config/routing/frontend.yml', 'frontend', 'yaml');
向同一槽导入多个资源?提供默认值(对于当前实例)
$routeImporter = new RouteImporter($container, 'frontend'); $routeImporter->import('@AcmeShopBundle/Resources/config/routing/frontend.yml'); // is imported in the frontend slot $routeImporter->import('@AcmeShopBundle/Resources/config/routing/backend.yml', 'backend'); // is imported in the backend slot
资源跟踪
路由系统在注册路由导入(使用 RouteImporter
)时,不会直接识别任何相关类。因此,删除包或更改配置可能不会直接重新加载您的路由模式(除非您使用 cache:clear
命令)。
如果您更改它们可能导致不同的路由导入模式,则需要注册扩展类和任何其他相关类,例如包的 Configuration
类。
要注册对象(例如 Extension
类及其父类),请使用
$routeImporter->addObjectResource($this);
或要注册类(及其父类)
$routeImporter->addObjectClass($this);
要注册任何 Symfony 支持的资源(完整路径),请使用
$routeImporter->addResource(new FileResource('my-file-file-path.yml'));
注意
仅在启用调试时跟踪资源。
导入的路由(
->import(...)
)会自动由路由系统跟踪,只有与导入注册相关的类应该被注册以进行跟踪。
加载已注册的路由
当您的路由导入到路由槽中后,就需要将它们加载到应用程序的路由模式中。
通常您会使用类似这样的方式
# app/config/routing.yml _frontend: resource: "frontend.yml" prefix: / _backend: resource: "frontend.yml" prefix: /
# frontend.yml _AcmeShop: resource: "@AcmeShopBundle/Resources/config/routing/frontend.yml"
# backend.yml _AcmeShop: resource: "@AcmeShopBundle/Resources/config/routing/backend.yml"
但您可以使用自动装配加载器来加载它们
# app/config/routing.yml _frontend: resource: "frontend" type: rollerworks_autowiring prefix: / _backend: resource: "backend" type: rollerworks_autowiring prefix: backend/
这就对了!所有导入到 'frontend' 和 'backend' 槽中的路由现在都加载到了应用程序的路由模式中。
但等等,如果该槽没有导入路由呢?
那么什么也不会发生,此包旨在使配置变得简单。如果没有导入路由槽,它将简单地返回一个空的 Collection,这在实际中永远不会被使用。
第三方导入示例
由于 Symfony 路由系统允许从路由文件加载任何路由资源,您实际上可以从另一个路由槽中加载路由槽。
假设您想允许其他人“扩展”您的包的路由模式
首先在应用程序的路由文件中导入主要部分
# app/config/routing.yml _frontend: resource: "frontend" type: rollerworks_autowiring prefix: / _backend: resource: "frontend" type: rollerworks_autowiring prefix: backend/
在 AcmeShopBundle 中定义以下路由,并导入它们(扩展片段省略)。
# Resources/config/routing/frontend.yml _products: resource: "routing/frontend/products.yml" prefix: /products _cart: resource: "routing/frontend/cart.yml" prefix: /cart
# Resources/config/routing/frontend.yml _products: resource: "routing/backend/products.yml" prefix: /products # Load other routing schema's from the routing-slot _imports: resource: "acme_shop.frontend" type: rollerworks_autowiring
其他人现在可以轻松地将他们的路由模式导入到 acme_shop.frontend
路由槽中。
版本控制
为了透明度和对发布周期的洞察,以及为了努力保持向后兼容性,此包尽可能按照语义版本控制指南进行维护。
版本号将采用以下格式
<主版本>.<次版本>.<修补程序>
并遵循以下指南
- 破坏向后兼容性会增加主版本(并重置次版本和修补程序)
- 没有破坏向后兼容性的新功能会增加次版本(并重置修补程序)
- 错误修复和杂项更改会增加修补程序
有关 SemVer 的更多信息,请访问 http://semver.org/。
许可证
此包根据 MIT 许可证 提供。