gos / pubsub-router-bundle
Symfony PubSub 路由 Bundle
Requires
- php: ^7.2 || ^8.0
- symfony/config: ^4.4.42 || ^5.4 || ^6.0
- symfony/console: ^4.4.42 || ^5.4 || ^6.0
- symfony/dependency-injection: ^4.4.42 || ^5.4 || ^6.0
- symfony/deprecation-contracts: ^2.1 || ^3.0
- symfony/http-foundation: ^4.4.42 || ^5.4 || ^6.0
- symfony/http-kernel: ^4.4.42 || ^5.4 || ^6.0
- symfony/polyfill-php80: ^1.22
- symfony/yaml: ^4.4.42 || ^5.4 || ^6.0
Requires (Dev)
- matthiasnoback/symfony-dependency-injection-test: ^4.1.2
- phpstan/extension-installer: ^1.1
- phpstan/phpstan: 1.8.5
- phpstan/phpstan-phpunit: 1.1.1
- phpstan/phpstan-symfony: 1.2.13
- phpunit/phpunit: ^8.5 || ^9.3
- psr/container: ^1.0 || ^2.0
- symfony/phpunit-bridge: ^5.4 || ^6.0
- 3.x-dev
- 2.x-dev
- v2.8.0
- v2.7.1
- v2.7.0
- v2.6.0
- v2.5.0
- v2.4.0
- v2.3.0
- v2.2.0
- v2.1.0
- v2.0.0
- v2.0.0-beta
- 1.x-dev
- v1.7.0
- v1.6.0
- v1.5.1
- v1.5.0
- v1.4.1
- v1.4.0
- v1.3.0
- v1.2.0
- v1.1.0
- v1.0.0
- v0.3.5
- v0.3.4
- v0.3.3
- v0.3.2
- v0.3.1
- v0.3.0
- v0.2.1
- v0.2.0
- v0.1.11
- v0.1.10
- v0.1.9
- v0.1.8
- v0.1.7
- v0.1.6
- v0.1.5
- v0.1.4
- v0.1.3
- v0.1.2
- v0.1.1
- v0.1.0
This package is auto-updated.
Last update: 2024-09-20 05:48:25 UTC
README
关于
GosPubSubRouterBundle 是一个 Symfony Bundle,其目标是连接 PubSub 通道背后的任何逻辑。当您使用 PubSub 模式时,您将面临一个问题,那就是业务逻辑依赖于通道。PubSub 路由器正是为了在通道和业务逻辑之间建立联系。
支持
特性
- 路由定义
- 路由匹配
- 路由生成器
安装
使用 Composer 将该包添加到您的项目中
composer require gos/pubsub-router-bundle
安装后,您需要将包添加到项目中。
如果您的项目基于 Symfony Flex,该包应自动添加到您的 config/bundles.php
文件。
Gos\Bundle\PubSubRouterBundle\GosPubSubRouterBundle::class => ['all' => true],
如果您的项目基于 Symfony 标准版,您需要通过编辑 app/AppKernel.php
将包添加到 Kernel 的 registerBundles
方法中。
class AppKernel extends Kernel { public function registerBundles() { $bundles = array( ... new \Gos\Bundle\PubSubRouterBundle\GosPubSubRouterBundle() ); ... }
包配置
以下是一个示例包配置。对于基于 Symfony Flex 的项目,应将其存储在 config/packages/gos_pubsub_router.yaml
中。对于基于 Symfony 标准版的项目,应将其添加到 app/config/config.yml
中。
#Gos PubSub Router gos_pubsub_router: routers: websocket: #available from container through gos_pubsub_router.websocket resources: - @GosNotificationBundle/Resources/config/pubsub/websocket/notification.yml redis: #available from container through gos_pubsub_router.redis resources: - @GosNotificationBundle/Resources/config/pubsub/redis/notification.yml
注意:每个路由器都是隔离的。如果您在同一个类中有多个路由器,您将需要注入您需要的每个路由器。
用法
路由定义
使用 WebSocket PubSub 的示例
user_notification: channel: notification/user/{role}/{application}/{user_ref} handler: ['Acme\Chat\MessageHandler', 'addPushers'] requirements: role: "editor|admin|client" application: "[a-z]+" user_ref: "\d+"
使用 Redis PubSub 的示例
user_app_notification: channel: notification:user:{role}:{application}:{user_ref} handler: ['Acme\Chat\MessageHandler', 'addPushers'] requirements: role: "editor|admin|client" application: "[a-z-]+-app" user_ref: "\d+"
注意:处理程序没有类型提示,这允许您以任何方式定义处理程序回调(例如,通过调用类上的方法或字符串调用 PHP 函数或容器中的服务来调用数组)。
使用路由器
让我们生成一个路由!
$router = $this->container->get('gos_pubsub_router.websocket'); $channel = $router->generate('user_notification', ['role' => 'admin', 'application' => 'blog-app', 'user_ref' => '123']); echo $channel // notification/user/admin/blog/123
匹配您的第一个路由!
use Gos\Bundle\PubSubRouterBundle\Request\PubSubRequest; $channel = 'notification/user/admin/billing-app/639409'; // 'notification/user/admin/billing-app/*' work :) list($routeName, $route, $attributes) = $router->match($channel); $request = new PubSubRequest($routeName, $route, $attributes); //Create a request object if you want transport the request data as dependency //$request->getAttributes()->get('user_ref'); it's a parameterBag // $router->match($channel); // $routeName -> 'user_app_notification // $route -> instance of Gos\Bundle\PubSubRouterBundle\Router\Route // $attributes -> [ 'role' => 'admin', 'application' => 'billing-app', 'user_ref' => '639409' ]
不匹配怎么办?
use Gos\Bundle\PubSubRouterBundle\Exception\ResourceNotFoundException; $channel = 'notification/user/admin/billing-app/azerty'; // will miss match try { list($routeName, $route, $attributes) = $router->match($channel); } catch (ResourceNotFoundException $e) { //handle exception }
- 如果您只需要生成路由,则对
Gos\Bundle\PubSubRouterBundle\Generator\GeneratorInterface
进行类型提示 - 如果您只需要匹配路由,则对
Gos\Bundle\PubSubRouterBundle\Matcher\MatcherInterface
进行类型提示 - 如果您需要两者,则对
Gos\Bundle\PubSubRouterBundle\Router\RouterInterface
进行类型提示
路由器 CLI
php bin/console gos:prouter:debug -r websocket
输出 WebSocket 路由器中注册的所有路由
许可证
MIT,查看项目根目录中的 LICENSE
文件。