timiki / rpc-server-bundle
symfony 的 JSON-RPC 服务器组件
Requires
- php: >=8.1
- ext-json: *
- symfony/console: ^6.0 | ^7.0
- symfony/dependency-injection: ^6.0 | ^7.0
- symfony/event-dispatcher: ^6.0 | ^7.0
- symfony/framework-bundle: ^6.0 | ^7.0
- symfony/http-foundation: ^6.0 | ^7.0
- symfony/http-kernel: ^6.0 | ^7.0
- symfony/property-access: ^6.0 | ^7.0
- symfony/serializer: ^6.0 | ^7.0
- symfony/stopwatch: ^6.0 | ^7.0
- timiki/rpc-common: ^2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- phpstan/phpstan: ^1.8
- phpstan/phpstan-symfony: ^1.2
- phpunit/phpunit: ^9.0
- symfony/browser-kit: ^6.0 | ^7.0
- symfony/cache: ^6.0 | ^7.0
- symfony/maker-bundle: ^1.13
- symfony/phpunit-bridge: ^6.0 | ^7.0
- symfony/security-bundle: ^6.0 | ^7.0
- symfony/translation: ^6.0 | ^7.0
- symfony/validator: ^6.0 | ^7.0
- symfony/yaml: ^6.0 | ^7.0
Suggests
- symfony/cache: For add cache for method
- symfony/security-bundle: For add check security for method
- symfony/validator: For add validate params for method
- dev-master
- 6.4.0
- 6.2.0
- 6.1.1
- 6.1.0
- 6.0.2
- 6.0.1
- 6.0.0
- 5.1.0
- 5.0.0
- 4.2.6
- 4.2.5
- 4.2.4
- 4.2.3
- 4.2.2
- 4.2.1
- 4.2.0
- 4.1.10
- 4.1.9
- 4.1.8
- 4.1.7
- 4.1.6
- 4.1.5
- 4.1.4
- 4.1.3
- 4.1.2
- 4.1.1
- 4.1.0
- 4.0.x-dev
- 4.0.7
- 4.0.6
- 4.0.5
- 4.0.4
- 4.0.3
- 4.0.2
- 4.0.1
- 4.0.0
- 3.0.13
- 3.0.12
- 3.0.11
- 3.0.10
- 3.0.9
- 3.0.8
- 3.0.7
- 3.0.6
- 3.0.5
- 3.0.4
- 3.0.3
- 3.0.2
- 3.0.1
- 3.0.0
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.1
- 2.0.0
- 1.1.0
- dev-4.2-dev
- dev-4.1-dev
- dev-6.1.0-dev
- dev-issues-14
This package is auto-updated.
Last update: 2024-09-17 08:12:13 UTC
README
JSON-RPC 是一种使用 JSON 编码的远程过程调用协议。它是一个非常简单的协议(与 XML-RPC 非常相似),仅定义了少量数据类型和命令。JSON-RPC 允许发送通知(发送到服务器但不需要响应的数据)和多个调用可以发送到服务器,这些调用可能以不同的顺序得到响应。
安装
Symfony >= 6.4 或 7.0
composer require timiki/rpc-server-bundle "^6.4"
Symfony >= 6.0
composer require timiki/rpc-server-bundle "^6.0"
已弃用的版本
Symfony >= 5.0 使用版本 ^5.0
composer require timiki/rpc-server-bundle "^5.0"
Symfony >= 4.3 使用版本 ^4.1
composer require timiki/rpc-server-bundle "^4.1"
Symfony < 4.3 使用版本 ^4.0
composer require timiki/rpc-server-bundle "^4.0"
配置
rpc_server: # Mapping configs # Default mapping # mapping: '%kernel.project_dir%/src/Method' # # Multi dir mapping # mapping: # - '%kernel.project_dir%/src/Method1' # - '%kernel.project_dir%/src/Method2' # # Multi handler|dir mapping # mapping: # v1: # - '%kernel.project_dir%/src/Method/V1' # v2: # - '%kernel.project_dir%/src/Method/V2' # mapping: '%kernel.project_dir%/src/Method' # Cache pool name cache: null # Serializer service, must be instanced of Timiki\Bundle\RpcServerBundle\Serializer\SerializerInterface # By default use Timiki\Bundle\RpcServerBundle\Serializer\BaseSerializer serializer: null parameters: # Allow extra params in JSON request allow_extra_params: false
将方法目录添加到自动装配排除列表中
App\: resource: '../src/*' exclude: '../src/{Method}'
控制器
默认
您可以使用自己的控制器来处理 JSON-RPC 请求。例如
<?php declare(strict_types=1); namespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; class RpcController extends AbstractController { public function indexAction(Request $request) { return $this->get('rpc.server.http_handler.default')->handleHttpRequest($request); } }
或将默认 JSON-RPC 路由(默认 POST 到 /rpc)添加到 routing.yml 中
rpc: path: /rpc defaults: { _controller: Timiki\Bundle\RpcServerBundle\Controller\RpcController::handlerAction } methods: [POST]
或不同处理器(版本)的控制器
rpc: path: /{version} defaults: { _controller: Timiki\Bundle\RpcServerBundle\Controller\RpcController::handlerAction, version: v1 } methods: [POST]
如果网站和 JSON-RPC 服务器位于不同的域名上,请记住关于 CORS。
方法
<?php declare(strict_types=1); namespace App\Method; use Timiki\Bundle\RpcServerBundle\Attribute as RPC; use Symfony\Component\Validator\Constraints as Assert; #[RPC\Method("name")] #[RPC\Roles(["ROLE_NAME"])] #[RPC\Cache(3600)] class Method { #[RPC\Param] #[Assert\NotBlank] protected $param; #[RPC\Execute] public function execute() { $param = $this->param; ... return $result; } }
或者您也可以使用 __invoke 声明调用方法
<?php declare(strict_types=1); namespace App\Method; use Timiki\Bundle\RpcServerBundle\Attribute as RPC; use Symfony\Component\Validator\Constraints as Assert; #[RPC\Method("name")] #[RPC\Roles(["ROLE_NAME"])] #[RPC\Cache(3600)] class Method { #[RPC\Param] #[Assert\NotBlank] protected $param; public function __invoke() { $param = $this->param; ... return $result; } }
注入方法执行上下文
<?php declare(strict_types=1); namespace App\Method; use Timiki\Bundle\RpcServerBundle\Attribute as RPC; use Timiki\Bundle\RpcServerBundle\Method\Context; use Symfony\Component\Validator\Constraints as Assert; #[RPC\Method("name")] #[RPC\Roles(["ROLE_NAME"])] #[RPC\Cache(3600)] class Method { #[RPC\Param] #[Assert\NotBlank] protected $param; public function __invoke(Context $context) { $param = $this->param; ... return $result; } }
属性
方法
将类定义为 JSON-RPC 方法。
#[Method("name")]
角色
为访问方法设置角色。如果用户没有权限访问服务器,则返回包含消息“方法未授权”和代码“-32001”的错误。
#[Roles(["ROLE_NAME", "ROLE_OTHER"])]
缓存
如果配置中定义了缓存,则设置响应的生存时间。
#[Cache(3600)]
参数
定义 JSON-RPC 参数。使用 Symfony\Component\Validator\Constraints 验证它们。
#[Param] protected $param; #[Param] protected $param = null'; // Default value for param
执行
在类中定义执行函数。
#[Execute] public function execute() { // Code }
或使用 __invoke
public function __invoke() { // Code }
序列化
在组件中,用于将方法输出的结果转换为 JSON 的工具是序列化器。
序列化器配置
rpc: serializer: rpc.server.serializer.base # serialize service id
组件中包含以下序列化器
rpc.server.serializer.base - (默认) 使用 Symfony 序列化将结果转换为 JSON rpc.server.serializer.role - 使用用户角色作为 @Group (@see https://symfony.com.cn/doc/current/components/serializer.html) 控制对输出数组的访问
创建自定义序列化器
以下是一个简单序列化类的示例。
<?php declare(strict_types=1); namespace App\Serializer; use Timiki\Bundle\RpcServerBundle\Serializer\SerializerInterface; class MySerializer implements SerializerInterface { public function serialize(mixed $data): string // You serialize logic } public function toArray(mixed $data): array // You serialize logic } }
然后添加自定义序列化器服务 ID 到配置中
rpc: serializer: MySerializer # serialize service id