proklung/bitrixsymfonyrouterbundle

Symfony 路由器,用于自定义 Bitrix-Symfony 实现

安装: 65

依赖者: 1

建议者: 0

安全: 0

星标: 2

关注者: 1

分支: 1

类型:symfony-bundle

1.4.5 2021-08-18 14:51 UTC

README

为什么?

内部。用于将功能最大化分散到各个包中。此外,用于在项目中避免复制粘贴工具。

安装

  1. composer require proklung/bitrixsymfonyrouterbundle

  2. standalone_bundles.php 中连接包

参数

配置包中的 symfony_router.yaml 文件

  • enabled - 使用包。默认值为 true
  • controller_annotations_path - 使用注释的控制器路径数组。
  • router_cache_path - 注释路由的缓存路径(例如 %kernel.cache.dir%/routes)。默认值为 null。如果设置,则路由将被缓存。
  • router_config_file - 路由配置文件的路径。默认值为 local/configs/routes.yaml。文件可以是任何支持的 Symfony 格式 - Yaml,PHP,XML 等。
  • router_check_exists_controller - 检查控制器类是否存在。默认值为 false

通过 Yaml 文件配置 Bitrix 的原生路由

从版本 21.400.0(2021年7月16日)开始,Bitrix 的主要模块中出现了 可用的 路由器。

为什么?

为了通过 Yaml 配置路由的常用方式使用它。

使用

路由描述文件(例如,/local/routes/web.php

use Prokl\ServiceProvider\ServiceProvider;
use Bitrix\Main\Routing\Controllers\PublicPageController;
use Prokl\BitrixSymfonyRouterBundle\Services\Agnostic\BaseRoutesConfigurator;
use Prokl\BitrixSymfonyRouterBundle\Services\Utils\BitrixRouteConvertor;
use Bitrix\Main\Routing\RoutingConfigurator;

// Не обязательно. Смотри ниже.
$container = ServiceProvider::instance();

$agnosticRouter = new BaseRoutesConfigurator(
    $_SERVER['DOCUMENT_ROOT'] . '/local/configs/bitrix_routes.yaml', // Конфиг роутов
    $_SERVER['DOCUMENT_ROOT'] . '/bitrix/cache/routes', // Кэш; если null - без кэширования.
    $_ENV['DEBUG']
);
$routeCollection = $agnosticRouter->getRoutes();

$routeConvertor = new BitrixRouteConvertor($routeCollection);
// Не обязательно. Без контейнера контроллеры будут инстанцироваться через new,
// а не через контейнер. Но тогда уже без разрешения зависимостей.
$routeConvertor->setContainer($container);

return function (RoutingConfigurator $routes) use ($container, $routeConvertor, $routeCollection) {

    $routeConvertor->convertRoutes($routes);
};

如果容器被连接,则可以使用简短的形式

use Prokl\ServiceProvider\ServiceProvider;
use Bitrix\Main\Routing\Controllers\PublicPageController;
use Prokl\BitrixSymfonyRouterBundle\Services\Utils\BitrixRouteConvertor;
use Bitrix\Main\Routing\RoutingConfigurator;

// Не обязательно. Смотри ниже.
$container = ServiceProvider::instance();

$routeCollection = $container->get('bitrix_native_routes.routes.collection');

$routeConvertor = new BitrixRouteConvertor($routeCollection);
// Не обязательно. Без контейнера контроллеры будут инстанцироваться через new,
// а не через контейнер. Но тогда уже без разрешения зависимостей.
$routeConvertor->setContainer($container);

return function (RoutingConfigurator $routes) use ($container, $routeConvertor, $routeCollection) {

    $routeConvertor->convertRoutes($routes);

    $routes->get('/', new PublicPageController('/index.php'));

};

配置路由的示例文件(普通的 YAML 格式路由文件,用于 Symfony)

first_bitrix_route:
  path: /foo/{param}/
  controller: 'Prokl\BitrixSymfonyRouterBundle\Tests\Fixture::cacheAction'
  methods: GET|POST
  requirements:
    param: '\d+'
  defaults:
    param: 'Russia'

# Старые статические страницы
# / => /index.php
public_page:
  path: /
  controller: ''
  defaults:
    _public: true # Ключевой признак

如果安装的 Bitrix 模块版本小于 21.400.0,则相应的服务将在编译阶段从包中删除。

在不使用容器和框架的情况下使用路由器

init.php:

use Prokl\BitrixSymfonyRouterBundle\Services\Agnostic\BaseRoutesConfigurator;
use Prokl\BitrixSymfonyRouterBundle\Services\Agnostic\Router;
use Prokl\BitrixSymfonyRouterBundle\Services\Agnostic\BitrixInitializerRouter;

$agnosticRouter = new BaseRoutesConfigurator(
    $_SERVER['DOCUMENT_ROOT'] . '/local/configs/standalone_routes.yaml',
    $_SERVER['DOCUMENT_ROOT'] . '/bitrix/cache/routes_agnostic', // Кэш; если null - без кэширования.
    $_ENV['DEBUG'] // Режим отладки или нет
);

$agnosticRouterInstance = new Router(
    $agnosticRouter->getRouter(),
    new BitrixInitializerRouter()
);

完成。路由将从 /local/configs/standalone_routes.yaml 中拉取。事件将自动连接。

允许同时存在多个这样的“诊断”路由器。

其他

  1. 可以从外部获取 Symfony\Component\Routing\Router(Symfony 路由)的实例如下
$router = \Prokl\BitrixSymfonyRouterBundle\Services\Agnostic\SymfonyRoutes::getInstance();
  1. 如何加载包的路由

在包的 Extension 文件中

    public function load(array $configs, ContainerBuilder $container) : void
    {
        // ....
         $this->loadRoutes(__DIR__ . '/../Resources/config', 'routes.yaml');
    }

    /**
     * Загрузить роуты в бандле.
     *
     * @param string $path   Путь к конфигу.
     * @param string $config Конфигурационный файл.
     *
     * @return void
     *
     * @throws InvalidArgumentException Нет класса-конфигуратора роутов.
     */
    private function loadRoutes(string $path, string $config = 'routes.yaml') : void
    {
        $routeLoader = new \Symfony\Component\Routing\Loader\YamlFileLoader(
            new FileLocator($path)
        );

        $routes = $routeLoader->load($config);

        if (class_exists(InitRouter::class)) {
            InitRouter::addRoutesBundle($routes);
            return;
        }

        throw new InvalidArgumentException('Class InitRouter not exist.');
    }

或者使用 trait Prokl\BitrixSymfonyRouterBundle\Services\Utils\LoaderBundleRoutesTrait,该方法已移至其中。