আমি কীভাবে সিএমফনি 2 কন্ট্রোলারে জেএসএন প্রতিক্রিয়া পাঠাতে পারি


90

আমি jQueryঅন্তর্নির্মিত আমার ফর্মটি সম্পাদনা করতে ব্যবহার করছি Symfony

আমি ফর্মটি jQueryসংলাপে প্রদর্শন করছি এবং তারপরে এটি জমা দিচ্ছি ।

ডেটাবেসে সঠিকভাবে প্রবেশ করা হচ্ছে।

তবে আমার কিছু JSONফেরত পাঠানো দরকার কিনা তা আমি জানি না jQuery। আসলে আমি কিছুটা নিয়ে বিভ্রান্ত হয়ে পড়েছি JSON

ধরুন আমি আমার টেবিলটিতে `Qu 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

সিমফনি ২.১

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

return $response;

সিমফনি ২.২ এবং উচ্চতর

আপনার বিশেষ জসনরেসপন্স ক্লাস রয়েছে, যা জেএসএন-তে অ্যারে সিরিয়াল করে:

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

তবে যদি আপনার সমস্যাটি কীভাবে সত্তাটিকে সিরিয়ালাইজ করতে হয় তবে আপনার জেএমএসএসিয়ালাইজারবান্ডেলটি দেখে নেওয়া উচিত

ধরে নিই যে আপনি এটি ইনস্টল করেছেন, আপনার কেবল কাজটি করতে হবে

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

return new Response($serializedEntity);

স্ট্যাকওভারফ্লোতে আপনার একই ধরণের সমস্যাগুলির জন্য পরীক্ষা করা উচিত:


4
তাহলে আমরা কীভাবে সত্তাকে সিরিয়ালাইজ করব এবং এটিকে JSON প্রতিক্রিয়া হিসাবে প্রেরণ করব? আমি এক সপ্তাহ ধরে এটি সন্ধান করছি .. স্ট্যাকওভারফ্লো
14798532/

এছাড়াও আপনি Symfony JsonResponse (Symfony \ কম্পোনেন্ট \ HttpFoundation \ JsonResponse) ব্যবহার করতে পারেন
আম্মি

4
কনটেন্ট-টাইপ শিরোলেখ নতুন রিসপন্স ($ সিরিয়ালাইজড এন্টিটি, 200, অ্যারে ('সামগ্রী-প্রকার' => 'অ্যাপ্লিকেশন / জেসন')) সেট করা আরও ভাল;
সের্গেই স্মিমনভ

সের্গির পরামর্শটি সর্বোত্তম (কমপক্ষে আমার জন্য), যদি আমি বিষয়বস্তুর ধরণটি সেট না করি তবে ক্লায়েন্টের কাছে আমি একটি পাঠ্য / এইচটিএমএল বিষয়বস্তুর ধরণ পাব। যদি আমি জসনরেসপোনস ব্যবহার করি তবে কিছু অদ্ভুত কারণে আমি ভিতরে থাকা সামগ্রীর সাথে একটি একক স্ট্রিং
পাই

56

সিমফনি ২.১ এর একটি জসনরেসপন্স ক্লাস রয়েছে।

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

অ্যারে পাস করা হবে JSON এনকোডেড স্থিতি কোডটি ডিফল্ট 200 হবে এবং সামগ্রী প্রকারটি অ্যাপ্লিকেশন / জেসসনে সেট করা হবে।

setCallbackজেএসএনপি-র জন্য একটি কার্যকরী অনুষ্ঠানও রয়েছে।


16

Symfony 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

@ থেক্যাটোন্টেফ্লাট উত্তরটি সম্পূর্ণ করতে আমি আপনার ক্রিয়াকলাপটি কোনও 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

যদি আপনার ডেটা ইতিমধ্যে সিরিয়ালযুক্ত হয়:

ক) একটি জেএসওএন প্রতিক্রিয়া পাঠান

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

খ) একটি জেএসএনপি প্রতিক্রিয়া পাঠান (কলব্যাক সহ)

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

যদি আপনার ডেটা সিরিয়ালাইজ করা প্রয়োজন:

গ) একটি জেএসওএন প্রতিক্রিয়া পাঠান

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

d) একটি JSONP প্রতিক্রিয়া পাঠান (কলব্যাক সহ)

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

e) সিমফনি 3.xxx এ গ্রুপগুলি ব্যবহার করুন

আপনার সত্তার ভিতরে গ্রুপ তৈরি করুন

<?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;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.