Symfony2 컨트롤러에서 JSON 응답을 어떻게 보낼 수 있습니까?
Symfony에 내장 된 양식을 편집하기 위해 jQuery를 사용하고 있습니다.
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');
}
이것은 성공 메시지가있는 템플릿입니다.
심포니 2.1
$response = new Response(json_encode(array('name' => $name)));
$response->headers->set('Content-Type', 'application/json');
return $response;
Symfony 2.2 이상
배열을 JSON으로 직렬화하는 특수 JsonResponse 클래스 가 있습니다 .
return new JsonResponse(array('name' => $name));
그러나 문제가 엔티티 직렬화 방법 인 경우 JMSSerializerBundle을 살펴 봐야합니다.
당신이 그것을 설치했다고 가정하면, 당신은 단순히
$serializedEntity = $this->container->get('serializer')->serialize($entity, 'json');
return new Response($serializedEntity);
또한 StackOverflow에서 유사한 문제를 확인해야합니다.
Symfony 2.1에는 JsonResponse 클래스가 있습니다.
return new JsonResponse(array('name' => $name));
전달 된 배열은 JSON으로 인코딩되고 상태 코드는 기본적으로 200으로 설정되고 콘텐츠 유형은 application / json으로 설정됩니다.
setCallback
JSONP를위한 편리한 기능 도 있습니다 .
Symfony 3.1부터 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());
}
To complete @thecatontheflat answer i would recommend to also wrap your action inside of a try ... catch
block. This will prevent your JSON endpoint to break on exceptions. Here's the skeleton I use:
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(),
]);
}
}
This way your endpoint will behave consistently even in case of an errors and you will be able to treat them right on a client side.
If your data is already serialized:
a) send a JSON response
public function someAction()
{
$response = new Response();
$response->setContent(file_get_contents('path/to/file'));
$response->headers->set('Content-Type', 'application/json');
return $response;
}
b) send a JSONP response (with callback)
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;
}
If your data needs be serialized:
c) send a JSON response
public function someAction()
{
$response = new JsonResponse();
$response->setData([some array]);
return $response;
}
d) send a JSONP response (with callback)
public function someAction()
{
$response = new JsonResponse();
$response->setData([some array]);
$response->setCallback('FUNCTION_CALLBACK_NAME');
return $response;
}
e) use groups in Symfony 3.x.x
Create groups inside your Entities
<?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;
}
// ...
}
Normalize your Doctrine Object inside the logic of your application
<?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;
참고URL : https://stackoverflow.com/questions/11714941/how-can-i-send-json-response-in-symfony2-controller
'IT story' 카테고리의 다른 글
iOS : NSUserDefaults에서 부울 사용 (0) | 2020.09.10 |
---|---|
바이트에서 특정 비트 가져 오기 (0) | 2020.09.10 |
C #에서 Windows Forms 양식을 닫는 Esc 단추 (0) | 2020.09.10 |
Linux 커널은 어떻게 자체적으로 컴파일 할 수 있습니까? (0) | 2020.09.10 |
RatingBar를 만들어 별 다섯 개를 표시하는 방법 (0) | 2020.09.10 |