如何查询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}
数据库
新代码:
/**
* @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);
}
谢谢你们
答案 0 :(得分:2)
这里似乎问题发生在json_encode部分,因为json_encode不知道如何访问你的私有属性,也不知道如何使用getter。
为此,您可以使用Symfony序列化程序Documentation for it 或JMSSerializer Bundle(如果您正在构建复杂的API,您迟早会需要它)
此外,您可以使用为您执行json_encode的new JsonResponse($yourObject)
,以及正确设置HTTP标头(否则,如果您使用Response,您的json仍将被浏览器宣传为{{1 }})