tonicforhealth/json-rpc

dev-master 2016-03-01 15:31 UTC

This package is not auto-updated.

Last update: 2024-09-20 18:59:19 UTC


README

处理 JSON-RPC 请求。

Build Status Scrutinizer Code Quality SensioLabsInsight

安装

通过 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 一起工作;
  • 向文档添加异常。