首页 > 解决方案 > 如何在 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","re​​t":{"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"}]}

标签: phpjsonsymfony

解决方案


您的 $data 是一个数据数组,(请参阅$query->getQuery()->getArrayResult()

因此,您正在尝试从数组中获取属性,而不是从适当的对象中访问它们。

由于您已经获得了一个数组结果,并且您想将其放在 json 的名称部分中,因此您可以将jsonResponse更改为:

return new JsonResponse(['result' => 'ok', 'ret' => ['name' => $data]]);

您可能需要更改查询以指定要获取哪些属性而不是获取整个实体,在您的情况下为 namemesupdate_time

就像是 :

 $entityManager->createQueryBuilder()
            ->select("r.name, r.mes, r.update_time")
            //...

推荐阅读