我正在尝试解决这个问题: 我的应用程序发送 JSON POST 请求,其中包含以 Json 编码的多个信息。示例:
{"UserInfoA":{"1":123,"2":"hello","3":"bye","4":{"subinfo":1,"subinfo2":10}},
"UserInfoB":{"a":"12345678","b":"asd"}} // and so on...
每个用户信息有:
因此,为了解决这个问题,我做了另一个控制器,如 JsonHandler,它接收此请求,然后将此 JSON 转换为不同的对象后转发到每个控制器。示例:
public function getJson (Request $request){
if (0 === strpos($request->headers->get('Content-Type'), 'application/json')) {
$data = json_decode($request->getContent(), true);
}
if (!isset($data['UserInfoA'])){
return new JsonResponse('ERROR');
}
$uia = $data['UserInfoA'];
$idInfoA = $this->forward('Path::dataAPersist',array('data'=>$uia));
}
// same with userinfoB and other objects
return $idInfoA ;
这很完美,但是正确吗?我应该使用服务吗?
编辑:我需要在 Json 中响应 ID,并且 this->forward 返回一个 Response,所以我不能使用 JsonResponse,如果直接发送 $idInfoA 只是发送 IDNUMBER,而不是在 JSON 中,我该怎么做?
总结一下:一个Json监听器,接收信息,处理它,然后分派到相应的控制器。这个监听器,应该是控制器、服务还是其他东西?
我建议使用 symfony-bundles/json-request-bundle 因为它为您执行 JsonRequestTransformerListener 。您只需要照常接收请求参数即可:
...
$request->get('some_parameter');
...
嗨,您必须使用服务来进行转型
php 类
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\GetResponseEvent;
class JsonRequestTransformerListener {
public function onKernelRequest(GetResponseEvent $event) {
$request = $event->getRequest();
$content = $request->getContent();
if (empty($content)) {
return;
}
if (!$this->isJsonRequest($request)) {
return;
}
if (!$this->transformJsonBody($request)) {
$response = Response::create('Unable to parse request.', 400);
$event->setResponse($response);
}
}
private function isJsonRequest(Request $request) {
return 'json' === $request->getContentType();
}
private function transformJsonBody(Request $request) {
$data = json_decode($request->getContent(), true);
if (json_last_error() !== JSON_ERROR_NONE) {
return false;
}
if ($data === null) {
return true;
}
$request->request->replace($data);
return true;
}
}
竭诚为您服务.yml
kernel.event_listener.json_request_transformer:
class: You\NameBundle\Service\JsonRequestTransformerListener
tags:
- { name: "kernel.event_listener", event: "kernel.request",method: "onKernelRequest", priority: "100" }
现在可以调用默认请求函数来获取数据了
$request->request->all();
您可以使用
symfony
ParamConverter 将 json
转换为您想要的任何对象,并在出现问题时引发有意义的 Exception
。
您可以添加自定义
ParamConverters
并通过 annotation
在您的操作中使用它们
你可以做一个
$data = $request->toArray();
。这样,您将拥有一个解析了 JSON 内容的关联数组。
例如下一个内容:
{
"id": 123,
"name": "Someone"
}
您可以拥有:
...
public function doSomething(Request $request) {
$data = $request->toArray();
$id = $data['id'];
$name = $data['name'];
doSomethingInteresting($name, $id);
}
...