Saya menggunakan jQuery
untuk mengedit formulir saya yang sudah ada di dalamnya Symfony
.
Saya menunjukkan formulir dalam jQuery
dialog dan kemudian mengirimkannya.
Data dimasukkan dengan benar dalam database.
Tapi saya tidak tahu apakah saya perlu mengirim JSON
kembali ke jQuery
. Sebenarnya saya agak bingung dengan JSON
hal itu.
Misalkan saya telah menambahkan baris di tabel saya dengan `` jQuery dan ketika saya mengirimkan formulir maka setelah data dikirimkan saya ingin mengirim kembali data baris tersebut sehingga saya dapat menambahkan baris tabel secara dinamis untuk menampilkan data yang ditambahkan.
Saya bingung bagaimana bisa mendapatkan data itu kembali.
Ini adalah kode saya saat ini:
$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');
}
Ini hanya template dengan pesan sukses.
sumber
Symfony 2.1 memiliki kelas JsonResponse .
return new JsonResponse(array('name' => $name));
Array yang diteruskan akan menjadi JSON yang dikodekan, kode status akan default ke 200 dan tipe konten akan disetel ke application / json.
Ada juga
setCallback
fungsi praktis untuk JSONP.sumber
Sejak Symfony 3.1 Anda dapat menggunakan JSON Helper 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()); }
sumber
Untuk melengkapi jawaban @thecatontheflat, saya akan merekomendasikan untuk juga membungkus tindakan Anda di dalam satu
try … catch
blok. Ini akan mencegah titik akhir JSON Anda melanggar pengecualian. Inilah kerangka yang saya gunakan: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(), ]); } }
Dengan cara ini, titik akhir Anda akan berperilaku secara konsisten bahkan jika terjadi kesalahan dan Anda akan dapat menanganinya tepat di sisi klien.
sumber
Jika data Anda sudah berseri:
a) mengirim tanggapan JSON
public function someAction() { $response = new Response(); $response->setContent(file_get_contents('path/to/file')); $response->headers->set('Content-Type', 'application/json'); return $response; }
b) mengirim tanggapan JSONP (dengan panggilan balik)
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; }
Jika data Anda perlu diserialkan:
c) mengirim tanggapan JSON
public function someAction() { $response = new JsonResponse(); $response->setData([some array]); return $response; }
d) mengirim tanggapan JSONP (dengan panggilan balik)
public function someAction() { $response = new JsonResponse(); $response->setData([some array]); $response->setCallback('FUNCTION_CALLBACK_NAME'); return $response; }
e) menggunakan grup di Symfony 3.xx
Buat grup di dalam Entitas Anda
<?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; } // ... }
Normalisasikan Objek Doktrin Anda di dalam logika aplikasi Anda
<?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;
sumber