Skip to content

Commit c4bd77c

Browse files
committed
parse params as object feature
1 parent f7f635e commit c4bd77c

7 files changed

+261
-41
lines changed

Action.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,11 @@ class Action extends \yii\base\Action
3333
*/
3434
public $paramsPassMethod;
3535

36+
/**
37+
* @var array Whether JSON parse should parse objects in `params` as associate arrays or objects
38+
*/
39+
public $requestParseAsArray;
40+
3641
/**
3742
* Parses json body.
3843
* @param $rawBody
@@ -101,6 +106,7 @@ public function runWithParams($params)
101106
try {
102107
$request = new JsonRpcRequest();
103108
$request->paramsPassMethod = $this->paramsPassMethod;
109+
$request->parseAsArray = $this->requestParseAsArray;
104110

105111
$request->load(ArrayHelper::toArray($requestData), '');
106112
if ($request->validate()) {

Controller.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,18 @@ class Controller extends \yii\web\Controller
2323
*/
2424
public $paramsPassMethod = self::JSON_RPC_PARAMS_PASS_FUNCARGS;
2525

26+
/**
27+
* @var array Whether JSON parse should parse objects in `params` as associative arrays or objects
28+
*/
29+
public $requestParseAsArray = true;
30+
2631
public function actions()
2732
{
2833
return [
2934
'index' => [
3035
'class' => Action::class,
3136
'paramsPassMethod' => $this->paramsPassMethod,
37+
'requestParseAsArray' => $this->requestParseAsArray
3238
]
3339
];
3440
}

JsonRpcRequest.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class JsonRpcRequest extends Model
2828
public $params = [];
2929

3030
public $paramsPassMethod;
31+
public $parseAsArray;
3132

3233
/**
3334
* @inheritdoc
@@ -166,14 +167,21 @@ public function execute()
166167
if ($this->paramsPassMethod == Controller::JSON_RPC_PARAMS_PASS_BODY) {
167168
$app->request->setBodyParams($this->params);
168169
$app->request->setRawBody(Json::encode($this->params));
169-
$result = $app->runAction($routeParsed, $params);
170+
$result = $app->runAction($routeParsed);
170171
} else {
171172
if (ArrayHelper::isAssociative($this->params)) {
172173
$params += $this->params;
173174
} else {
174175
// allow non-named parameters
175176
$params += $this->bindParamsArray($routeParsed, $this->params);
176177
}
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+
177185
$result = $app->runAction($routeParsed, $params);
178186
}
179187
} catch (JsonRpcException $e) {

demo/controllers/DemoController.php

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,31 @@ public function actionSomeMethod()
1616
return "Some response";
1717
}
1818

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+
1944
/**
2045
* @param $foo
2146
* @param $bar
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
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+
}

0 commit comments

Comments
 (0)