proklung/wp-symfony-router-bundle

Symfony Router for custom implementation Wordpress-Symfony

1.4.5 2021-08-18 13:11 UTC

README

为什么?

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

安装

  1. composer require proklung/wp.symfony.router.bundle

  2. standalone_bundles.php 中连接包

参数

配置包中的 symfony_router.yaml 文件

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

"原生" Wordpress AJAX 处理器(通过 wp-admin.php)

Yaml 文件类型(普通路由描述文件)

examples_wp: # Action роута
  path: ''   # Игнор. Нужно, чтобы генератор коллекций роутов не падал.
  methods: [GET, POST]
  controller: 'Local\Services\Wordpress\SampleAjaxController::action'
  defaults:
    _public: true # Публичный роут или только для админки?

为了实现原生 AJAX 处理器,建议使用类 Prokl\WpSymfonyRouterBundle\Services\NativeAjax\AbstractWPAjaxController。它继承自 AbstractController 并添加了一个构造函数,该构造函数接受一个依赖 - Request 类的对象。之所以这样做,是因为在 WordPress AJAX 处理器中无法传递参数(除了超全局变量如 $_POST$_GET)。

此外,在控制器请求中还会传递路由的各种参数。例如 methods

这使得例如在处理器的 action 中截断不正确的请求类型成为可能。

class SampleAjaxController extends AbstractWPAjaxController
{
    public function action()
    {
        $this->checkTypeRequest('Invalid type request');

        $response = new Response(
            'OK',
            Response::HTTP_OK
        );

        $response->headers->set('Content-Type', 'application/html; charset=utf-8');
        $response->send();
        
        wp_die();
    }
}

或者编写一些与路由参数 defaultsrequirementsoptions 相关的逻辑。

在没有容器和框架外使用路由器

functions.php:

use Prokl\WpSymfonyRouterBundle\Services\Agnostic\RoutesConfigurator;
use Prokl\WpSymfonyRouterBundle\Services\Agnostic\Router;
use Prokl\WpSymfonyRouterBundle\Services\Agnostic\WpInitializerRouter;

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

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

所有。路由将从 /local/configs/standalone_routes.yaml 中拉取。事件将自动绑定。

允许同时存在多个此类 "诊断" 路由器。

其他

  1. 可以通过以下方式从外部获取 Symfony\Component\Routing\Router 实例
$router = \Prokl\WpSymfonyRouterBundle\Services\Agnostic\RoutesConfigurator::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\WpSymfonyRouterBundle\Services\Utils\LoaderBundleRoutesTrait,其中包含此方法。