场景是,客户端(我网站中的所有请求,如Ajax)将请求类似{"token":"mytoken"}
的json字符串.PHP通过$request->getContent()
和json_decode
接收它。我将它存储在一个名为$data
的变量中,这样我就可以在任何Controller中获取它。
我还创建了一个按键获取值的方法,像
这样的代码public function input($key, $default = '', $func = '')
{
$ret = '';
if (isset($this->data[$key])) {
$ret = $this->data[$key];
} else {
return $default;
}
if (is_string($func)) {
if (in_array($func, ['int', 'string', 'array'])) {
settype($ret, $func);
return $ret;
}
if ($func)
$ret = call_user_func($func, $ret);
} elseif (is_array($func)) {
if ($func)
$ret = call_user_func_array($func, [$ret]);
}
if (!$ret)
return $default;
return $ret;
}
虽然我可以将其注册到服务器,但我使用它$this->get('input')->input($mykey);
,这将出现在任何控制器中。这是一个建议的解决方案?
问题只是我的头衔,怎么样?救救我。
答案 0 :(得分:1)
考虑添加一个请求事件侦听器,该侦听器解析JSON并在请求对象中设置结果数据。示例实现:
<?php
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
class ParseJsonRequestListener
{
public function onKernelRequest(GetResponseEvent $event)
{
$request = $event->getRequest();
// only parse the content body if the content type is JSON
if (preg_match('/\bjson\b/', $request->getContentType())) {
$parameters = json_decode($request->getContent(), true);
if ($parameters) {
$request->request->replace($parameters);
}
}
}
}
注册监听器,例如在app / config / services.yml:
中parse_json_request_listener:
class: ParseJsonRequestListener
tags:
- { name: kernel.event_listener, event: kernel.request }
现在,在任何接收JSON请求的控制器中,您都可以从请求中获取已解析的JSON数据,例如:
<?php
$token = $request->request->get('token');
答案 1 :(得分:0)
如果方法在控制器中,那么您可以将$ request对象添加到params:
use Symfony\Component\HttpFoundation\Request;
//...
public function input(Request $request, $key, $default = '', $func = '')
//...
请求对象具有所有全局变量。更多信息:http://symfony.com/doc/current/introduction/http_fundamentals.html#symfony-request-object