Symfony和doctrine从sql数据库查询获得null响应

时间:2015-05-31 05:16:48

标签: php mysql json symfony doctrine-orm

如何查询mySql数据库?出于某种原因,我没有得到我期望的答案。

我有一个message表,其中包含messageBody列。

我也试图将其作为JSON格式化对象的数组返回。

/**
 * @Route("/api/messages")
 * @Template()
 */
public function messagesGetAction()
{

    $repository = $this->getDoctrine()->getRepository('AppBundle:Message');
    $messagesArr = $repository->findBy(array('messageBody'=>'messageBody'));
    $messages = json_encode($messagesArr);

    return new Response($messages);

}

这是返回的内容

[{},{},{}]

我的问题是如何构建一个正确的get控制器来返回api json响应?

消息实体

<?php

namespace AppBundle\Entity;

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="message")
 */
class Message
{

    /**
     * @var integer
     */
    private $id;

    /**
     * @var string
     */
    private $fromUser;

    /**
     * @var string
     */
    private $toUser;

    /**
     * @var string
     */
    private $messageTitle;

    /**
     * @var string
     */
    private $messageBody;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set fromUser
     *
     * @param string $fromUser
     * @return Message
     */
    public function setFromUser($fromUser)
    {
        $this->fromUser = $fromUser;

        return $this;
    }

    /**
     * Get fromUser
     *
     * @return string 
     */
    public function getFromUser()
    {
        return $this->fromUser;
    }

    /**
     * Set toUser
     *
     * @param string $toUser
     * @return Message
     */
    public function setToUser($toUser)
    {
        $this->toUser = $toUser;

        return $this;
    }

    /**
     * Get toUser
     *
     * @return string 
     */
    public function getToUser()
    {
        return $this->toUser;
    }

    /**
     * Set messageTitle
     *
     * @param string $messageTitle
     * @return Message
     */
    public function setMessageTitle($messageTitle)
    {
        $this->messageTitle = $messageTitle;

        return $this;
    }

    /**
     * Get messageTitle
     *
     * @return string 
     */
    public function getMessageTitle()
    {
        return $this->messageTitle;
    }

    /**
     * Set messageBody
     *
     * @param string $messageBody
     * @return Message
     */
    public function setMessageBody($messageBody)
    {
        $this->messageBody = $messageBody;

        return $this;
    }

    /**
     * Get messageBody
     *
     * @return string 
     */
    public function getMessageBody()
    {
        return $this->messageBody;
    }
}

路由

## api routes
app_getmessages: 
  pattern: /api/messages
  defaults: { _controller: AppBundle:Default:messages}

数据库

enter image description here

新代码:

/**
 * @Route("/api/messages")
 * @Template()
 */
public function messagesGetAction()
{

    $repository = $this->getDoctrine()->getRepository('XYGamingBundle:Message');
    $messagesArr = $repository->findAll();
    $json = new JsonResponse($messagesArr);

    if (!$json) {
        throw $this->createNotFoundException(
            'No messages found'
        );
    }

    return new Response($json);

}

解决方案

// add to controller
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Encoder\XmlEncoder;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;

/**
 * @Route("/api/messages")
 * @Template()
 */
public function messagesGetAction()
{

    //$serializer = $container->get('jms_serializer');
    // $serializer->serialize($data, $format);
    // $data = $serializer->deserialize($inputStr, $typeName, $format);

    $encoders = array(new XmlEncoder(), new JsonEncoder());
    $normalizers = array(new GetSetMethodNormalizer());
    $serializer = new Serializer($normalizers, $encoders);

    $repository = $this->getDoctrine()->getRepository('XYGamingBundle:Message');
    $data = $repository->findAll();

    //$json = $serializer->serialize($data, 'json');

    $json = $serializer->serialize($data, 'json');

    //$json = new JsonResponse($messagesArr);

    if (!$json) {
        throw $this->createNotFoundException(
            'No messages found'
        );
    }

    return new Response($json);

}

谢谢你们

1 个答案:

答案 0 :(得分:2)

这里似乎问题发生在json_encode部分,因为json_encode不知道如何访问你的私有属性,也不知道如何使用getter。

为此,您可以使用Symfony序列化程序Documentation for it 或JMSSerializer Bundle(如果您正在构建复杂的API,您迟早会需要它)

此外,您可以使用为您执行json_encode的new JsonResponse($yourObject),以及正确设置HTTP标头(否则,如果您使用Response,您的json仍将被浏览器宣传为{{1 }})