Używam jQuery
do edycji mojego formularza, który jest wbudowany Symfony
.
Pokazuję formularz w jQuery
oknie dialogowym i przesyłam go.
Dane są poprawnie wprowadzane do bazy danych.
Ale nie wiem, czy muszę wysłać jakąś JSON
grzbiet jQuery
. Właściwie jestem trochę zdezorientowany JSON
.
Załóżmy, że dodałem wiersz w mojej tabeli z `` jQuery i kiedy przesyłam formularz, a następnie po przesłaniu danych chcę odesłać te dane wiersza, aby móc dynamicznie dodać wiersz tabeli, aby pokazać dodane dane.
Nie wiem, jak odzyskać te dane.
To jest mój obecny kod:
$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');
}
To tylko szablon z komunikatem o sukcesie.
źródło
Symfony 2.1 ma klasę JsonResponse .
return new JsonResponse(array('name' => $name));
Przekazana tablica będzie zakodowana w formacie JSON, kod stanu będzie domyślnie ustawiony na 200, a typ zawartości zostanie ustawiony na application / json.
Jest też przydatna
setCallback
funkcja dla JSONP.źródło
Od Symfony 3.1 możesz używać 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()); }
źródło
Aby uzupełnić @thecatontheflat odpowiedź, zalecałbym również zawinięcie akcji wewnątrz
try … catch
bloku. Zapobiegnie to przerywaniu punktu końcowego JSON w przypadku wyjątków. Oto szkielet, którego używam: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(), ]); } }
W ten sposób Twój punkt końcowy będzie zachowywał się konsekwentnie nawet w przypadku błędów i będziesz mógł je traktować bezpośrednio po stronie klienta.
źródło
Jeśli Twoje dane są już serializowane:
a) wysłać odpowiedź 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) wysłać odpowiedź JSONP (z oddzwonieniem)
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; }
Jeśli Twoje dane wymagają serializacji:
c) wysłać odpowiedź JSON
public function someAction() { $response = new JsonResponse(); $response->setData([some array]); return $response; }
d) wysłać odpowiedź JSONP (z oddzwonieniem)
public function someAction() { $response = new JsonResponse(); $response->setData([some array]); $response->setCallback('FUNCTION_CALLBACK_NAME'); return $response; }
e) używać grup w Symfony 3.xx
Twórz grupy wewnątrz swoich jednostek
<?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; } // ... }
Normalizuj obiekt Doctrine w logice aplikacji
<?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;
źródło