मैं symfony2 कंट्रोलर में JSON की प्रतिक्रिया कैसे भेज सकता हूं


90

मैं jQueryअपने फॉर्म को संपादित करने के लिए उपयोग कर रहा हूं जो अंदर बनाया गया है Symfony

मैं jQueryसंवाद में फ़ॉर्म दिखा रहा हूं और फिर उसे सबमिट कर रहा हूं ।

डेटाबेस में डेटा सही ढंग से दर्ज हो रहा है।

लेकिन मुझे नहीं पता कि मुझे कुछ JSONवापस भेजने की जरूरत है या नहीं jQuery। दरअसल मैं JSONबात को लेकर थोड़ा भ्रमित हूं ।

मान लीजिए कि मैंने अपनी तालिका में `` jQuery के साथ एक पंक्ति जोड़ दी है और जब मैं फॉर्म जमा करता हूँ तो डेटा जमा होने के बाद मैं उन पंक्ति डेटा को वापस भेजना चाहता हूँ ताकि मैं जोड़े गए डेटा को दिखाने के लिए गतिशील रूप से तालिका पंक्ति जोड़ सकूँ।

मैं असमंजस में हूं कि उस डेटा को वापस कैसे लाया जा सकता है।

यह मेरा वर्तमान कोड है:

$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');               
}

यह सफलता संदेश के साथ सिर्फ टेम्पलेट है।

जवाबों:


187

सिम्फनी 2.1

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

return $response;

सिम्फनी 2.2 और उच्चतर

आपके पास विशेष JsonResponse वर्ग है, जो JSON को क्रमबद्ध करता है:

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

लेकिन अगर आपकी समस्या यह है कि वशीकरण कैसे करें तो आपको JMSSerializerBundle पर एक नजर डालनी चाहिए

यह मानते हुए कि आपने इसे स्थापित किया है, आपको बस करना होगा

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

return new Response($serializedEntity);

आपको StackOverflow पर इसी तरह की समस्याओं के लिए भी जाँच करनी चाहिए:


1
तो हम इकाई को कैसे सीरियलाइज़ करते हैं और इसे JSON रिस्पांस के रूप में भेजते हैं? मैं एक हफ्ते से उसकी तलाश कर रहा हूं .. stackoverflow.com/questions/14798532/…
जॉर्ज कैटसनोस

तुम भी सिम्फोनी JsonResponse (Symfony \ घटक \ HttpFoundation \ JsonResponse) का उपयोग कर सकते
बच्ची

5
कंटेंट-टाइप हेडर को नया रिस्पॉन्स सेट करना बेहतर है ($ serializedEntity, 200, array ('कंटेंट-टाइप' => 'एप्लीकेशन / json'));
सर्गी स्मिर्नोव

Sergii का सुझाव सबसे अच्छा है (कम से कम मेरे लिए), अगर मैं सामग्री-प्रकार सेट नहीं करता हूं, तो क्लाइंट पर मुझे एक पाठ / html सामग्री-प्रकार प्राप्त होगा। अगर मैं JsonResponse का उपयोग करता हूँ, तो किसी अजीब कारण से मुझे अंदर की सामग्री के साथ एक ही तार मिलता है
लुइसफ

56

सिम्फनी 2.1 में एक JsonResponse वर्ग है।

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

अरैज़ में पास किया गया JSON एनकोडेड होगा, स्टेटस कोड 200 तक डिफॉल्ट होगा और कंटेंट टाइप एप्लीकेशन / जसन पर सेट हो जाएगा।

setCallbackJSONP के लिए एक आसान कार्य भी है ।


16

सिम्फनी 3.1 के बाद से आप JSON हेल्पर 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());
}

10

@Thecatontheflat उत्तर को पूरा करने के लिए मैं एक try … catchब्लॉक के अंदर अपनी कार्रवाई को लपेटने की भी सिफारिश करूंगा । यह आपके JSON के समापन बिंदु को अपवादों पर टूटने से रोकेगा। यहां मैं कंकाल का उपयोग करता हूं:

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(),
        ]);

    }
}

इस तरह आपका एंडपॉइंट त्रुटियों के मामले में भी लगातार व्यवहार करेगा और आप ग्राहक के पक्ष में सही व्यवहार कर पाएंगे।


8

यदि आपका डेटा पहले से ही क्रमबद्ध है:

a) JSON प्रतिक्रिया भेजें

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

बी) एक JSONP प्रतिक्रिया भेजें (कॉलबैक के साथ)

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;
}

यदि आपके डेटा को क्रमबद्ध किया जाना है:

ग) एक JSON प्रतिक्रिया भेजें

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

डी) एक JSONP प्रतिक्रिया भेजें (कॉलबैक के साथ)

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

ई) सिम्फनी 3.xx में समूहों का उपयोग करें

अपनी संस्थाओं के अंदर समूह बनाएँ

<?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;
    }

    // ...
}

अपने आवेदन के तर्क के अंदर अपने सिद्धांत वस्तु को सामान्य करें

<?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;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.