Symfony请求json为邮递员

时间:2018-05-23 11:25:55

标签: json symfony

我有我的CRUD,但我需要与邮递员做一个POST请求。我一直在阅读一些帖子,但我真的不明白它是如何运作的。

我的路线:

jugador_create:
path:     /{_format}
defaults: { _controller: "FutbolBundle:Jugador:new", _format: html }
requirements: { _method: post, _format: html|xml|json }

我的控制器是:

public function newAction(Request $request)
{
    $entity = new Jugador();
    $form = $this->createCreateForm($entity);

    if ($request->getMethod() == 'POST'){
        $form->handleRequest($request);
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
            $em->persist($entity);
            $em->flush();

            return $this->redirect($this->generateUrl('jugador_show', array('id' => $entity->getId())));
    }}

    return $this->render('FutbolBundle:Jugador:new.html.twig', array(
        'entity' => $entity,
        'form'   => $form->createView(),
    ));
}

我如何在邮递员中这样做我可以做一个JSON帖子并创建它?我想我需要使用Json,xml和默认情况进行切换,但我并不真正理解如何使用Json部分。

非常感谢你。

此外,在我的索引中,我已经使用Json和xml进行了切换,但它与GET相比,与POST非常不同。

public function indexAction(Request $request){
    $request = $this->getRequest();
    $serializer = new Serializer(array(new GetSetMethodNormalizer()),array(new XmlEncoder(), new JsonEncoder()));
    $em = $this->getDoctrine()->getManager();
    $entities = $em->getRepository('FutbolBundle:Jugador')->findAll();

    switch ($request->getRequestFormat()){
        case "json":
            $response=new Response();
            $response->setContent($serializer->serialize($entities,'json'));
            return $response;
        break;
        case "xml":
            $response=new Response();
            $response->setContent($serializer->serialize($entities,'xml'));
            return $response;

        break;
        default:
            return $this->render('FutbolBundle:Jugador:index.html.twig', array(
        'entities' => $entities,
    ));
    }
}

2 个答案:

答案 0 :(得分:0)

我的消化情况如下:

  

实现格式侦听器以避免在所有控制器中重复代码

// initial js object 
let initial = {"1293818383": {"xp": 200,"level": 3,"name": "User 1"}, "235489445527289867": {"xp": 300, "level": 1, "name": "User 2"}, "123189273132": {  "xp": 100, "level": 3, "name": "User 3" }
    }

// convert object to json -- THIS IS START OF QUESTION
let json = JSON.stringify(initial)

// intantiate userArray
var userArray = []

// parse json into js object
var parsed = JSON.parse(json)

for (let obj in parsed){
// use each key of object to get value
  userArray.push(parsed[obj])
}
console.log(userArray)
// [ { xp: 200, level: 3, name: 'User 1' }, { xp: 300, level: 1, name: 'User 2' }, { xp: 100, level: 3, name: 'User 3' } ]

之后,您的控制器不应该更改,因为您已经将数据从json转换为常规发布的数据。你可以使用xml格式或者你想要的格式,但是html。

  

在邮递员中指定标题    在方法/网址下方的标题选项中,只需添加内容类型标题,如下所示。

public function onKernelRequest(GetResponseEvent $event)
    {
        $request = $event->getRequest();

        if ('json' === $request->getContentType() && $request->getContent()) {
           $data = json_decode($request->getContent(), true); 
           $request->request->replace($data);
        }       
    }

那应该有用

希望它有所帮助。

PD:Si no entiendes todo lo que escrito hazmelo saber。

答案 1 :(得分:-1)

万一有人需要帮助,我实际上使用集合和Symfony的实体非常简单。

$data = json_decode($request->getContent(),true);
$entity->setNom($data["nom"]);
$entity->setEquip($data["equip"]);
... (more sets if you need them)

用于将其插入数据库。

$em = $this->getDoctrine()->getManager();
$em->persist($entity);
$em->flush();