@@ -11,158 +11,164 @@ Symfony JSON-RPC HTTP Server to convert an HTTP json-rpc request into HTTP json-
11
11
12
12
## How to use
13
13
14
- Sdk requires only two things :
15
- - A method resolver : must implement [ MethodResolverInterface] ( ./src/Domain/Model/MethodResolverInterface.php ) , resolving logic's is your own.
16
- - Methods : JsonRpc methods that implement [ JsonRpcMethodInterface] ( ./src/Domain/Model/JsonRpcMethodInterface.php )
17
-
18
- :warning : No dependency injection is managed in this library
19
-
20
- ### Example
21
- #### JSON-RPC Method
22
- ``` php
23
- use Yoanm\JsonRpcServer\Domain\Model\JsonRpcMethodInterface;
24
-
25
- class DummyMethod implements JsonRpcMethodInterface
26
- {
27
- /**
28
- * @param array $paramList
29
- *
30
- * @throws \Exception
31
- */
32
- public function validateParams(array $paramList)
33
- {
34
- //If case your app require a specific param for instance
35
- if (!isset($paramList['my-required-key')) {
36
- throw new \Exception('"my-required-key" is a required key');
37
- }
38
- }
39
-
40
- /**
41
- * @param array|null $paramList
42
- *
43
- * @return array|int|null
44
- */
45
- public function apply(array $paramList = null)
46
- {
47
- // Handle the request
48
- ...
49
- // Then return a result
50
- return [
51
- 'status' => 'done',
52
- ];
53
- // Or
54
- return null;
55
- // Or
56
- return 12345;
57
- }
58
- }
59
- ```
60
- #### Array method resolver (simple example)
61
- * You could take example on [ the one used for behat tests] ( ./features/bootstrap/App/BehatMethodResolver.php ) *
62
- ``` php
63
- use Yoanm\JsonRpcServer\Domain\Exception\JsonRpcMethodNotFoundException;
64
- use Yoanm\JsonRpcServer\Domain\Model\JsonRpcMethodInterface;
65
- use Yoanm\JsonRpcServer\Domain\Model\MethodResolverInterface;
66
-
67
- class ArrayMethodResolver implements MethodResolverInterface
68
- {
69
- /** @var JsonRpcMethodInterface[] */
70
- private $methodList = [];
71
-
72
- /**
73
- * @param string $methodName
74
- *
75
- * @return JsonRpcMethodInterface
76
- *
77
- * @throws JsonRpcMethodNotFoundException
78
- */
79
- public function resolve(string $methodName) : JsonRpcMethodInterface
80
- {
81
- if (!isset($this->methodList[$methodName])) {
82
- throw new JsonRpcMethodNotFoundException($methodName);
83
- }
84
-
85
- return $this->methodList[$methodName];
86
- }
87
-
88
- /**
89
- * @param JsonRpcMethodInterface $method
90
- * @param string $methodName
91
- */
92
- public function addMethod(JsonRpcMethodInterface $method, string $methodName)
93
- {
94
- $this->methodList[$methodName] = $method;
95
- }
96
- }
97
- ```
14
+ You can either use this library as a simple extension or like any symfony bundle.
98
15
99
- Then add your method to the resolver and create the endpoint :
100
- ``` php
101
- use Yoanm\JsonRpcServer\App\Creator\CustomExceptionCreator;
102
- use Yoanm\JsonRpcServer\App\Creator\ResponseCreator;
103
- use Yoanm\JsonRpcServer\App\Manager\MethodManager;
104
- use Yoanm\JsonRpcServer\App\RequestHandler;
105
- use Yoanm\JsonRpcServer\App\Serialization\RequestDenormalizer;
106
- use Yoanm\JsonRpcServer\App\Serialization\ResponseNormalizer;
107
- use Yoanm\JsonRpcServer\Infra\Endpoint\JsonRpcEndpoint;
108
- use Yoanm\JsonRpcServer\Infra\Serialization\RawRequestSerializer;
109
- use Yoanm\JsonRpcServer\Infra\Serialization\RawResponseSerializer;
110
-
111
- $resolver = new ArrayMethodResolver();
112
- $resolver->addMethod(
113
- 'dummy-method'
114
- new DummyMethod()
115
- );
116
-
117
- $responseCreator = new ResponseCreator();
118
-
119
- $endpoint = new JsonRpcEndpoint(
120
- new RawRequestSerializer(
121
- new RequestDenormalizer()
122
- ),
123
- new RequestHandler(
124
- new MethodManager(
125
- $resolver,
126
- new CustomExceptionCreator()
127
- ),
128
- $responseCreator
129
- ),
130
- new RawResponseSerializer(
131
- new ResponseNormalizer()
132
- ),
133
- $responseCreator
134
- );
135
- ```
16
+ * [ Behat demo app configuration folders] ( ./features/demo_app/ ) can be used as examples.*
136
17
137
- Once endpoint is ready, you can send it request string :
138
- ``` php
139
- use Yoanm\JsonRpcServer\Infra\Endpoint\JsonRpcEndpoint;
140
-
141
- $requestString = <<<JSONRPC
142
- {
143
- " jsonrpc" : " 2.0" ,
144
- " id" : 1
145
- " method" : " dummy-method" ,
146
- " params" : {
147
- " my-required-key" : " a-value"
148
- }
149
- }
150
- JSONRPC;
151
-
152
- $responseString = $endpoint- >index($requestString);
153
- ```
18
+ ### With Symfony bundle
154
19
155
- ` $responseString ` will be the following string depending of method returned value :
156
- * ``` json
157
- {"jsonrpc" :" 2.0" ,"id" :1 ,"result" :{"status" :" done" }}
20
+ - Add the bundles in your ` config/bundles.php ` file:
21
+ ``` php
22
+ // config/bundles.php
23
+ return [
24
+ ...
25
+ Yoanm\SymfonyJsonRpcHttpServer\JsonRpcHttpServerBundle::class => ['all' => true],
26
+ ...
27
+ ];
158
28
```
159
- * ``` json
160
- {"jsonrpc" :" 2.0" ,"id" :1 ,"result" :null }
29
+
30
+ - Add the following in your routing configuration :
31
+ ``` yaml
32
+ # config/routes.yaml
33
+ json-rpc-endpoint :
34
+ resource : ' @JsonRpcHttpServerBundle/Resources/config/routing/endpoint.xml'
35
+ ` ` `
36
+
37
+ - Add the following in your configuration :
38
+ ` ` ` yaml
39
+ # config/config.yaml
40
+ json_rpc_http_server : ~
161
41
` ` `
162
42
163
- * ``` json
164
- {"jsonrpc" :" 2.0" ,"id" :1 ,"result" :12345 }
43
+ ### With Symfony extension only
44
+ - Load the extension in your kernel :
45
+ ` ` ` php
46
+ // src/Kernel.php
47
+ ...
48
+ use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
49
+ use Yoanm\SymfonyJsonRpcHttpServer\DependencyInjection\JsonRpcHttpServerExtension;
50
+ ...
51
+ class Kernel
52
+ {
53
+ use MicroKernelTrait;
54
+ ....
55
+ /**
56
+ * {@inheritdoc}
57
+ */
58
+ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader)
59
+ {
60
+ /**** Add and load extension **/
61
+ $container->registerExtension($extension = new JsonRpcHttpServerExtension());
62
+ // If you use Symfony Config component, add "json_rpc_http_server : ~" in your configuration.
63
+ // Else load it there
64
+ $container->loadFromExtension($extension->getAlias());
65
+
66
+ ...
67
+ }
68
+ ....
69
+ }
70
+ ```
71
+
72
+ - Map your your JSON-RPC methods, see ** JSON-RPC Method mapping** section below
73
+ - Manually configure an endpoint, see ** Routing** section below
74
+
75
+ ## JSON-RPC Method mapping
76
+ You have many ways to inject you json-rpc methods :
77
+ - If you use the bundle, you can do it by configuration :
78
+ ``` yaml
79
+ # config/config.yaml
80
+ json_rpc_http_server :
81
+ methods_mapping :
82
+ method-a : ' @method-a.service-id'
83
+ method-b :
84
+ service : ' @method-b.service-id'
85
+ aliases : ' method-b-alias'
86
+ method-c :
87
+ service : ' @method-c.service-id'
88
+ aliases : ['method-c-alias-1', 'method-c-alias-2']
89
+ ` ` `
90
+ - You can use tag in the service definition as below :
91
+ ` ` ` yaml
92
+ services :
93
+ method-a.service-id :
94
+ class : Method\A\Class
95
+ public : true # <= do no forget the set visibility to public !
96
+ tags :
97
+ - { name: 'json_rpc_http_server.jsonrpc_method', method: 'method-a' }
98
+ - { name: 'json_rpc_http_server.jsonrpc_method', method: 'method-a-alias' }
99
+ ` ` `
100
+ - Inject manually your mapping during container building
101
+ ` ` ` php
102
+ // src/Kernel.php
103
+ ...
104
+ use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
105
+ use Yoanm\SymfonyJsonRpcHttpServer\DependencyInjection\JsonRpcHttpServerExtension;
106
+ ...
107
+ class Kernel implements CompilerPassInterface
108
+ {
109
+ ....
110
+ /**
111
+ * {@inheritdoc}
112
+ */
113
+ public function process(ContainerBuilder $container)
114
+ {
115
+ $container->getDefinition(JsonRpcHttpServerExtension::SERVICE_NAME_RESOLVER_SERVICE_NAME)
116
+ ->addMethodCall('addMethodMapping', ['method-a', 'method-a.service-id'])
117
+ ->addMethodCall('addMethodMapping', ['method-b', 'method-b.service-id'])
118
+ ->addMethodCall('addMethodMapping', ['method-b-alias', 'method-b.service-id'])
119
+ ;
120
+ }
121
+ ....
122
+ }
123
+ ```
124
+ - Or inject manually your mapping after container building
125
+ ``` php
126
+ $container->get(JsonRpcHttpServerExtension::SERVICE_NAME_RESOLVER_SERVICE_NAME)
127
+ ->addMethodMapping('method-a', 'method-a.service-id')
128
+ ->addMethodMapping('method-b', 'method-b.service-id')
129
+ ->addMethodMapping('method-b-alias', 'method-b.service-id')
130
+ ;
165
131
```
132
+
133
+ ## Routing
134
+ - If you use the bundle, the default endpoint is ` /json-rcp ` . You can custome it by using :
135
+ ``` yaml
136
+ # config/config.yaml
137
+ json_rpc_http_server :
138
+ http_endpoint_path : ' /my-custom-endpoint'
139
+ ` ` `
140
+
141
+ - Or you can define your own route and bind the endpoint as below :
142
+ ` ` ` yaml
143
+ # config/routes.yaml
144
+ index :
145
+ path : /my-json-rpc-endpoint
146
+ defaults : { _controller: 'json_rpc_http_server.endpoint:index' }
147
+ ` ` `
148
+
149
+ ## Custom method resolver
150
+
151
+ By default this bundle use [` yoanm/jsonrpc-server-sdk-psr11-resolver`](https://github.com/yoanm/php-jsonrpc-server-sdk-psr11-resolver).
152
+
153
+ In case you want to use your own, you can do it by using :
154
+
155
+ # ## Service definition tag
156
+ Use `json_rpc_http_server.method_resolver` tag as following :
157
+ ` ` ` yaml
158
+ services:
159
+ my.custom_method_resolver.service:
160
+ class: Custom\M ethod\R esolver\C lass
161
+ tags: ['json_rpc_http_server.method_resolver']
162
+ ` ` `
163
+
164
+ # ## Bundle configuration
165
+ Configure the bundle as below
166
+ ` ` ` yaml
167
+ # config/config.yaml
168
+ json_rpc_http_server:
169
+ method_resolver: '@my.custom_method_resolver.service'
170
+ ` ` `
171
+
166
172
167
173
# # Contributing
168
174
See [contributing note](./CONTRIBUTING.md)
0 commit comments