tonicforhealth / json-rpc
JSON-RPC 请求处理器
dev-master
2016-03-01 15:31 UTC
Requires
Requires (Dev)
- phpspec/phpspec: ~2.3
This package is not auto-updated.
Last update: 2024-09-20 18:59:19 UTC
README
处理 JSON-RPC 请求。
安装
通过 composer 需求依赖
$ composer require tonicforhealth/model-transformer
使用
设计 API 处理器
<?php namespace TonicForHealth\SurveyDesigner\Api; use TonicForHealth\SurveyDesigner\Api\Request\SurveyGetRequest; use TonicForHealth\SurveyDesigner\Api\Response\SurveyGetResponse; use TonicForHealth\SurveyDesigner\Entity\Repository\SurveyRepository; use Tonic\Component\ApiLayer\JsonRpcExtensions\Security\Annotation as RPCSec; use Tonic\Component\ApiLayer\JsonRpc\Annotation as RPC; use Tonic\Component\ApiLayer\ModelTransformer\ModelTransformer; class SurveyApi { /** * @var ModelTransformer */ private $modelTransformer; /** * @var SurveyRepository */ private $surveyRepository; /** * Constructor. * * @param ModelTransformer $modelTransformer * @param SurveyRepository $surveyRepository */ public function __construct(ModelTransformer $modelTransformer, SurveyRepository $surveyRepository) { $this->modelTransformer = $modelTransformer; $this->surveyRepository = $surveyRepository; } /** * Get survey by specified identifier. * * @RPC\Method(name = "survey.get") * * @param SurveyGetRequest $surveyGetRequest * * @return SurveyGetResponse */ public function get(SurveyGetRequest $surveyGetRequest) { $survey = $this->surveyRepository->find($surveyGetRequest->surveyId); return $this->modelTransformer->transform($survey, SurveyGetRequest::class); } // ... }
带有请求
<?php namespace TonicForHealth\SurveyDesigner\Api\Request; class SurveyGetRequest { /** * Survey id. * * @var int */ public $surveyId; }
和响应
<?php namespace TonicForHealth\SurveyDesigner\Api\Response; class SurveyGetResponse { /** * Survey name. * * @var string */ public $name; }
模型转换库 可以用于将领域对象转换为响应对象。
创建加载器和注册方法
$loader = new \Tonic\Component\ApiLayer\JsonRpc\Method\Loader\MutableAnnotationLoader(new \Doctrine\Common\Annotations\AnnotationReader()); $loader->add(new \TonicForHealth\SurveyDesigner\Api\SurveyApi($modelTransformer, new \TonicForHealth\SurveyDesigner\Entity\Repository\SurveyRepository()));
创建服务器
$server = (new \Tonic\Component\ApiLayer\JsonRpc\ServerFactory())->create( $loader, new \Tonic\Component\ApiLayer\JsonRpc\Method\ArgumentMapper\ArgumentMapper( new \Tonic\Component\ApiLayer\JsonRpc\Method\ArgumentMapper\Normalizer\Normalizer() ), new \Tonic\Component\ApiLayer\JsonRpc\Method\MethodInvoker() );
处理请求
$response = $server->handle('{"jsonrpc": "2.0", "method": "calc.subtract", "params": {"subtrahend": 23, "minuend": 42}, "id": 3}'); // $response = '{"jsonrpc": "2.0", "result": 19, "id": 3}';
规范
所有实际文档都是在 /spec
目录下的可运行库规范。
为确保库没有损坏,请在库目录下运行
bin/phpspec run
想法与改进
- 解决请求和响应中集合的完全限定名(FQCN)问题;
- 解决完全限定名别名问题;
- 方法元数据可以更抽象以便在不同的层中重用;
- 解决验证消息问题;
- 错误代码约定;
- 从文档生成器中删除数组;
- 添加批量可能性;
- 添加无 id 的通知方法;
- 编写简单的 API 客户端;
- 编写完整的文档;
- 添加模型转换器感知接口;
- 为规范器添加错误处理;
- 规范化应检查反规范化错误;
- 在类型解析器中处理集合类型;
- 将使用块解析为在规范器检测类型方法中与 FQCN 一起工作;
- 向文档添加异常。