web-gelistirme-sc.com

Symfony2 denetleyicisinde nasıl json yanıt gönderebilirim

Symfony'de yerleşik olan formumu düzenlemek için jQuery kullanıyorum.

Formu jQuery iletişim kutusunda gösterip gönderiyorum.

Veri veritabanına doğru giriyor.

Fakat bazı JSON’ları jQuery’e geri göndermem gerekip gerekmediğini bilmiyorum. Aslında biraz JSON olayıyla kafam karıştı.

JQuery ile tablomuza bir satır eklediğimi ve formu gönderdiğimde veri gönderildikten sonra, bu satır verilerini geri göndermek istiyorum, böylece eklenen verileri göstermek için dinamik olarak tablo satırını ekleyebilirim.

Bu veriyi nasıl geri alabilirim kafam karıştı

Bu benim şu anki kodum

$editForm = $this->createForm(new StepsType(), $entity);

$request = $this->getRequest();

$editForm->bindRequest($request);

if ($editForm->isValid()) {
    $em->persist($entity);
    $em->flush();

    return $this->render('::success.html.twig');               
}

Bu sadece başarı mesajıyla bir şablon

87
user825904

Symfony 2.1

$response = new Response(json_encode(array('name' => $name)));
$response->headers->set('Content-Type', 'application/json');

return $response;

Symfony 2.2 ve üstü

Diziyi JSON'a seri hale getiren özel JsonResponse sınıfınız var:

return new JsonResponse(array('name' => $name));

Fakat eğer probleminiz Varlık nasıl serileştirilir o zaman şöyle bir göz atmalısınız: JMSSerializerBundle

Yüklü olduğunu varsayarsak, yapmanız gereken sadece

$serializedEntity = $this->container->get('serializer')->serialize($entity, 'json');

return new Response($serializedEntity);

StackOverflow'ta da benzer problemleri kontrol etmelisiniz:

186
Vitalii Zurian

Symfony 2.1, JsonResponse sınıfına sahiptir.

return new JsonResponse(array('name' => $name));

Dizide geçirilen JSON kodlu olacak, durum kodu varsayılan olarak 200 olacak ve içerik tipi application/json olarak ayarlanacaktır.

JSONP için kullanışlı bir setCallback fonksiyonu da vardır.

55
jmaloney

Symfony 3.1’den bu yana JSON Yardımcısı’nı kullanabilirsiniz http://symfony.com/doc/current/book/controller.html#json-helper

public function indexAction()
{
// returns '{"username":"jane.doe"}' and sets the proper Content-Type header
return $this->json(array('username' => 'jane.doe'));

// the shortcut defines three optional arguments
// return $this->json($data, $status = 200, $headers = array(), $context = array());
}
15
Bettinz

@Tecatontheflat cevabını tamamlamak için eyleminizi bir try ... catch bloğuna da sarmanızı tavsiye ederim. Bu, JSON uç noktanızın istisnaları kırmasını önler. İşte kullandığım iskelet:

public function someAction()
{
    try {

        // Your logic here...

        return new JsonResponse([
            'success' => true,
            'data'    => [] // Your data here
        ]);

    } catch (\Exception $exception) {

        return new JsonResponse([
            'success' => false,
            'code'    => $exception->getCode(),
            'message' => $exception->getMessage(),
        ]);

    }
}

Böylece uç noktanız bir hata durumunda bile tutarlı bir şekilde davranacak ve onlara doğrudan müşteri tarafında davranabileceksiniz.

9
Slava Fomin II

Verileriniz zaten serileştirilmişse:

a) bir JSON yanıtı gönderin

public function someAction()
{
    $response = new Response();
    $response->setContent(file_get_contents('path/to/file'));
    $response->headers->set('Content-Type', 'application/json');
    return $response;
}

b) JSONP yanıtı (geri arama ile) gönderin

public function someAction()
{
    $response = new Response();
    $response->setContent('/**/FUNCTION_CALLBACK_NAME(' . file_get_contents('path/to/file') . ');');
    $response->headers->set('Content-Type', 'text/javascript');
    return $response;
}

Verilerinizin seri hale getirilmesi gerekiyorsa:

c) JSON yanıtı gönder

public function someAction()
{
    $response = new JsonResponse();
    $response->setData([some array]);
    return $response;
}

d) bir JSONP yanıtı (geri arama ile) gönderin

public function someAction()
{
    $response = new JsonResponse();
    $response->setData([some array]);
    $response->setCallback('FUNCTION_CALLBACK_NAME');
    return $response;
}

e) Symfony 3.x.x içindeki grupları kullanın

Kurumunuzda gruplar oluşturun

<?php

namespace Mindlahus;

use Symfony\Component\Serializer\Annotation\Groups;

/**
 * Some Super Class Name
 *
 * @ORM    able("table_name")
 * @ORM\Entity(repositoryClass="SomeSuperClassNameRepository")
 * @UniqueEntity(
 *  fields={"foo", "boo"},
 *  ignoreNull=false
 * )
 */
class SomeSuperClassName
{
    /**
     * @Groups({"group1", "group2"})
     */
    public $foo;
    /**
     * @Groups({"group1"})
     */
    public $date;

    /**
     * @Groups({"group3"})
     */
    public function getBar() // is* methods are also supported
    {
        return $this->bar;
    }

    // ...
}

Doctrine'nuzu normalleştirin Uygulamanızın mantığının içindeki nesne

<?php

use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Serializer\Mapping\Factory\ClassMetadataFactory;
// For annotations
use Doctrine\Common\Annotations\AnnotationReader;
use Symfony\Component\Serializer\Mapping\Loader\AnnotationLoader;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;

...

$repository = $this->getDoctrine()->getRepository('Mindlahus:SomeSuperClassName');
$SomeSuperObject = $repository->findOneById($id);

$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
$encoder = new JsonEncoder();
$normalizer = new ObjectNormalizer($classMetadataFactory);
$callback = function ($dateTime) {
    return $dateTime instanceof \DateTime
        ? $dateTime->format('m-d-Y')
        : '';
};
$normalizer->setCallbacks(array('date' => $callback));
$serializer = new Serializer(array($normalizer), array($encoder));
$data = $serializer->normalize($SomeSuperObject, null, array('groups' => array('group1')));

$response = new Response();
$response->setContent($serializer->serialize($data, 'json'));
$response->headers->set('Content-Type', 'application/json');
return $response;
8
Avram Cosmin