File tree 7 files changed +261
-41
lines changed
7 files changed +261
-41
lines changed Original file line number Diff line number Diff line change @@ -33,6 +33,11 @@ class Action extends \yii\base\Action
33
33
*/
34
34
public $ paramsPassMethod ;
35
35
36
+ /**
37
+ * @var array Whether JSON parse should parse objects in `params` as associate arrays or objects
38
+ */
39
+ public $ requestParseAsArray ;
40
+
36
41
/**
37
42
* Parses json body.
38
43
* @param $rawBody
@@ -101,6 +106,7 @@ public function runWithParams($params)
101
106
try {
102
107
$ request = new JsonRpcRequest ();
103
108
$ request ->paramsPassMethod = $ this ->paramsPassMethod ;
109
+ $ request ->parseAsArray = $ this ->requestParseAsArray ;
104
110
105
111
$ request ->load (ArrayHelper::toArray ($ requestData ), '' );
106
112
if ($ request ->validate ()) {
Original file line number Diff line number Diff line change @@ -23,12 +23,18 @@ class Controller extends \yii\web\Controller
23
23
*/
24
24
public $ paramsPassMethod = self ::JSON_RPC_PARAMS_PASS_FUNCARGS ;
25
25
26
+ /**
27
+ * @var array Whether JSON parse should parse objects in `params` as associative arrays or objects
28
+ */
29
+ public $ requestParseAsArray = true ;
30
+
26
31
public function actions ()
27
32
{
28
33
return [
29
34
'index ' => [
30
35
'class ' => Action::class,
31
36
'paramsPassMethod ' => $ this ->paramsPassMethod ,
37
+ 'requestParseAsArray ' => $ this ->requestParseAsArray
32
38
]
33
39
];
34
40
}
Original file line number Diff line number Diff line change @@ -28,6 +28,7 @@ class JsonRpcRequest extends Model
28
28
public $ params = [];
29
29
30
30
public $ paramsPassMethod ;
31
+ public $ parseAsArray ;
31
32
32
33
/**
33
34
* @inheritdoc
@@ -166,14 +167,21 @@ public function execute()
166
167
if ($ this ->paramsPassMethod == Controller::JSON_RPC_PARAMS_PASS_BODY ) {
167
168
$ app ->request ->setBodyParams ($ this ->params );
168
169
$ app ->request ->setRawBody (Json::encode ($ this ->params ));
169
- $ result = $ app ->runAction ($ routeParsed, $ params );
170
+ $ result = $ app ->runAction ($ routeParsed );
170
171
} else {
171
172
if (ArrayHelper::isAssociative ($ this ->params )) {
172
173
$ params += $ this ->params ;
173
174
} else {
174
175
// allow non-named parameters
175
176
$ params += $ this ->bindParamsArray ($ routeParsed , $ this ->params );
176
177
}
178
+
179
+ if (is_array ($ params ) && !$ this ->parseAsArray ) {
180
+ foreach ($ params as $ key => $ value ) {
181
+ $ params [$ key ] = Json::decode (Json::encode ($ value ), false );
182
+ }
183
+ }
184
+
177
185
$ result = $ app ->runAction ($ routeParsed , $ params );
178
186
}
179
187
} catch (JsonRpcException $ e ) {
Original file line number Diff line number Diff line change @@ -16,6 +16,31 @@ public function actionSomeMethod()
16
16
return "Some response " ;
17
17
}
18
18
19
+ /**
20
+ * @param $params
21
+ * @return mixed
22
+ */
23
+ public function actionEcho (array $ params )
24
+ {
25
+ return [
26
+ 'params ' => $ params ,
27
+ 'type ' => gettype ($ params )
28
+ ];
29
+ }
30
+
31
+ public function actionEchoObject ($ params )
32
+ {
33
+ return [
34
+ 'params ' => $ params ,
35
+ 'type ' => gettype ($ params )
36
+ ];
37
+ }
38
+
39
+ public function actionObjectFoo ($ object )
40
+ {
41
+ return $ object ->foo ;
42
+ }
43
+
19
44
/**
20
45
* @param $foo
21
46
* @param $bar
Original file line number Diff line number Diff line change
1
+ <?php
2
+
3
+ namespace app \controllers ;
4
+
5
+ use \georgique \yii2 \jsonrpc \Controller ;
6
+
7
+ class ObjectParamsJsonRpcController extends Controller
8
+ {
9
+ // Disable CSRF validation for JSON-RPC POST requests
10
+ public $ enableCsrfValidation = false ;
11
+
12
+ public $ requestParseAsArray = false ;
13
+ }
You can’t perform that action at this time.
0 commit comments