rollerworks/route-autowiring-bundle

此包已废弃,不再维护。未建议替代包。

轻松在任何路由方案部分加载(自动绑定)路由

安装量: 30,405

依赖项: 1

建议者: 0

安全: 0

星标: 8

关注者: 4

分支: 4

开放问题: 0

类型:symfony-bundle

v1.2.0 2019-12-03 19:54 UTC

This package is auto-updated.

Last update: 2021-08-21 09:55:56 UTC


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 许可证 提供。