symfony2 컨트롤러에서 JSON 응답을 전송하려면 어떻게 해야 합니까?
사용하고 있다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');
}
이것은 성공 메시지가 포함된 템플릿일 뿐입니다.
Symfony 2.1
$response = new Response(json_encode(array('name' => $name)));
$response->headers->set('Content-Type', 'application/json');
return $response;
Symfony 2.2 이후
특수한 JsonResponse 클래스가 있어 어레이를 JSON으로 시리얼화합니다.
return new JsonResponse(array('name' => $name));
그러나 엔티티를 시리얼화하는 방법에 문제가 있는 경우 JMS Serializer Bundle을 참조하십시오.
인스톨 되어 있는 것을 전제로 하면, 간단하게 다음의 조작을 실행할 수 있습니다.
$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
기능을 합니다.
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());
}
@the catonthe plat answer를 완료하려면 액션을 @the flat answer로 감싸는 것도 추천합니다.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(),
]);
}
}
이렇게 하면 오류가 발생한 경우에도 엔드포인트가 일관되게 동작하고 클라이언트 측에서 올바르게 처리할 수 있습니다.
데이터가 이미 일련화되어 있는 경우:
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;
}
b) 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;
}
데이터를 시리얼화할 필요가 있는 경우:
c) JSON 응답 전송
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) Symfony 3.x.x 의 그룹을 사용합니다.
엔티티 내부에 그룹 작성
<?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;
만약 당신이 symfony 5를 적절하게 사용한다면 그것은 작동할 것입니다.
$data = $serializer->serialize(array('key' => 'value'), JsonEncoder::FORMAT);
return new JsonResponse($data, Response::HTTP_OK, [], true);
언급URL : https://stackoverflow.com/questions/11714941/how-can-i-send-json-response-in-symfony2-controller
'source' 카테고리의 다른 글
var_dump를 예쁘게 꾸미다 (0) | 2023.01.02 |
---|---|
sudo 없이 mysql 실행 (0) | 2023.01.02 |
MySQL에서의 IPv6 주소 저장 (0) | 2023.01.02 |
Vue - 다른 컴포넌트 내부에서 컴포넌트 사용 (0) | 2022.12.28 |
(i<=j&j<=i&i!=j)가 TRUE로 평가되는 이유는 무엇입니까? (0) | 2022.12.28 |