proklung / wp-symfony-router-bundle
Symfony Router for custom implementation Wordpress-Symfony
Requires
- php: >=7.3 || ^8.0
- symfony/config: ^4.4 || ^5.0
- symfony/dependency-injection: ^4.4 || ^5.0
- symfony/event-dispatcher: ^4.4 || ^5.0
- symfony/expression-language: ^4.4 || ^5.0
- symfony/filesystem: ^4.4 || ^5.0
- symfony/framework-bundle: ^4.4 || ^5.0
- symfony/http-foundation: ^4.4 || ^5.0
- symfony/http-kernel: ^4.4 || ^5.0
- symfony/property-access: ^4.4 || ^5.0
- symfony/routing: ^4.4 || ^5.0
- symfony/serializer: ^4.4 || ^5.0
Requires (Dev)
This package is auto-updated.
Last update: 2024-09-18 19:49:48 UTC
README
为什么?
内部. 用于将功能最大化地分散到各个包中。此外,还可以避免在项目中复制粘贴工具。
安装
-
composer require proklung/wp.symfony.router.bundle
-
在
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(); } }
或者编写一些与路由参数 defaults
、requirements
或 options
相关的逻辑。
在没有容器和框架外使用路由器
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
中拉取。事件将自动绑定。
允许同时存在多个此类 "诊断" 路由器。
其他
- 可以通过以下方式从外部获取
Symfony\Component\Routing\Router
实例
$router = \Prokl\WpSymfonyRouterBundle\Services\Agnostic\RoutesConfigurator::getInstance();
- 如何加载包的路线
在包的 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
,其中包含此方法。