Запрос Symfony с JSON для почтальона - PullRequest
0 голосов
/ 23 мая 2018

У меня есть 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.

Большое вам спасибо.

Кроме того, в моемindex Я уже переключился с 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 голосов
/ 28 мая 2018

На всякий случай, если кому-то нужна помощь, я на самом деле сделал это довольно просто, используя наборы и сущность 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();
0 голосов
/ 23 мая 2018

Мое предложение следующее:

Реализация прослушивателя формата, чтобы избежать повторения кода во всех контроллерах

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

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

После этого ваш контроллер не должен меняться, потому чтоВы уже преобразовали данные из JSON в регулярные данные.Вы можете сделать то же самое с форматом xml или любым другим форматом, который вам нужен, но html.

Укажите заголовки в параметрах почтальона. В разделе «Заголовки» ниже метода / url просто добавьте заголовок Content-type следующим образом.

Content-type(key) application/json (value)
Content-type(key) application/xml (value)

Это должно сработать

Надеюсь, это поможет.

PD: Si no entiendes todo lo que, он escrito hazmelo saber.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...