gos/pubsub-router-bundle

Symfony PubSub 路由 Bundle

资助包维护!
mbabker

安装次数: 1,952,774

依赖项: 1

建议者: 0

安全性: 0

星标: 42

关注者: 7

分支: 6

开放问题: 0

类型:symfony-bundle

v2.8.0 2022-09-20 01:46 UTC

README

Latest Stable Version Latest Unstable Version Total Downloads License Run Tests

关于

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 文件。