php - 如何在 symfony 3.4 中返回 json 响应
问题描述
这是一个新手问题,但我无法在任何地方找到答案。
我正在尝试从 Symfony 3.4 中的控制器返回 JSON 响应。
在控制器中我有:
namespace MegBundle\Controller;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\Routing\Annotation\Route;
use MegBundle\Entity\message;
use Doctrine\ORM\Tools\Pagination\Paginator;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\Common\Inflector\Inflector;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Method;
class MegController extends Controller
{
/**
* @Route("/message/board/page/{page}", name = "message_board", defaults = {"page" = 1}, requirements = {"page" = "\d+"})
* @Method("GET")
*/
public function showMeg(Request $request, $page)
{
$entityManager = $this->getDoctrine()->getEntityManager();
if ($request->query->get("DESC") != null) {
$orderById = "DESC=ID";
$orderby = 'DESC';
}
if ($request->query->get("DESC") == null) {
$orderById = "ASC=ID";
$orderby = 'ASC';
}
$per = 5;
$start = ($page-1)*$per;
$query = $entityManager->createQueryBuilder()
->select("r")
->from("MegBundle:message", "r")
->orderBy('r.id', $orderby)
->setFirstResult($start)
->setMaxResults($per);
$data = $query->getQuery()->getArrayResult();
$paginator = new Paginator($query, $fetchJoinCollection = false);
$count = count($paginator);
$pages = ceil($count/$per);
return new JsonResponse(['result' => 'ok', 'ret' => ['name' => $data->getName(),
'mes' => $data->getMes(),
'update_time' => $data->getUpdateTime()->format('Y-m-d H:i:s')]]);
}
但我明白了
调用数组上的成员函数 getName()。
我希望我能像这样得到 JosnResponse
{"result":"ok","ret":{"name":[{"name":"AAA","mes":"1234","update_time":"2019-09-20 10:54: 50"},{"name":"AAA","mes":"1234","update_time":"2019-09-20 11:08:53"},{"name":"赖","mes ":"AppleAppleappleAPPLE","update_time":"2019-09-20 11:11:09"}]}
解决方案
您的 $data 是一个数据数组,(请参阅$query->getQuery()->getArrayResult()
)
因此,您正在尝试从数组中获取属性,而不是从适当的对象中访问它们。
由于您已经获得了一个数组结果,并且您想将其放在 json 的名称部分中,因此您可以将jsonResponse更改为:
return new JsonResponse(['result' => 'ok', 'ret' => ['name' => $data]]);
您可能需要更改查询以指定要获取哪些属性而不是获取整个实体,在您的情况下为 name、mes和update_time。
就像是 :
$entityManager->createQueryBuilder()
->select("r.name, r.mes, r.update_time")
//...
推荐阅读
- reactjs - 从 React 状态处理动态背景
- c# - 通过 StructureMap 定义“HttpClient”单例会导致有关“HttpMessageHandler”未在运行时配置的错误
- verilog - 如何在 Verilog 中构建向上计数器
- jenkins - Jenkins 脚本化管道仅在 Github 中发生提交时触发作业
- c++ - 将参数传递给 void(*)(void*)
- javascript - 以编程方式将数据加载到 TinyMCE
- c# - 通过 pushbullet API 提取来电者电话号码
- redis - Redis 使用过多的内存较少的键数
- asp.net-mvc - Asp .net mvc web.config 文件中的 System.Codedeom 替代解决方案
- javascript - Three.js - 如何确定网格和粒子系统之间的交叉点?