Estoy desarrollando una aplicación de juego y usando Symfony 2.0. Tengo muchas solicitudes AJAX al backend. Y más respuestas está convirtiendo la entidad a JSON. Por ejemplo:
class DefaultController extends Controller
{
public function launchAction()
{
$user = $this->getDoctrine()
->getRepository('UserBundle:User')
->find($id);
// encode user to json format
$userDataAsJson = $this->encodeUserDataToJson($user);
return array(
'userDataAsJson' => $userDataAsJson
);
}
private function encodeUserDataToJson(User $user)
{
$userData = array(
'id' => $user->getId(),
'profile' => array(
'nickname' => $user->getProfile()->getNickname()
)
);
$jsonEncoder = new JsonEncoder();
return $jsonEncoder->encode($userData, $format = 'json');
}
}
Y todos mis controladores hacen lo mismo: obtienen una entidad y codifican algunos de sus campos en JSON. Sé que puedo usar normalizadores y codificar todas las entidades. Pero, ¿qué pasa si una entidad tiene enlaces cíclicos a otra entidad? ¿O el gráfico de entidades es muy grande? ¿Tienes alguna sugerencia?
Pienso en algún esquema de codificación para entidades ... o en usar NormalizableInterface
para evitar el ciclo ...,
fuente
Con php5.4 ahora puedes hacer:
Y luego llama
fuente
OneToMany
relaciones)Puede codificar automáticamente en Json, su entidad compleja con:
fuente
Para completar la respuesta: Symfony2 viene con una envoltura alrededor de json_encode: Symfony / Component / HttpFoundation / JsonResponse
Uso típico en sus controladores:
Espero que esto ayude
J
fuente
Encontré que la solución al problema de serializar entidades fue la siguiente:
en mi controlador:
otro ejemplo:
incluso puede configurarlo para deserializar matrices en http://api.symfony.com/2.0
fuente
Solo tenía que resolver el mismo problema: codificación json de una entidad ("Usuario") que tiene una Asociación bidireccional de uno a muchos con otra entidad ("Ubicación").
Probé varias cosas y creo que ahora encontré la mejor solución aceptable. La idea era usar el mismo código que escribió David, pero de alguna manera interceptar la recursividad infinita diciéndole al Normalizador que se detenga en algún momento.
No quería implementar un normalizador personalizado, ya que este GetSetMethodNormalizer es un buen enfoque en mi opinión (basado en la reflexión, etc.). Así que he decidido subclasificarlo, lo cual no es trivial a primera vista, porque el método para decir si incluir una propiedad (isGetMethod) es privado.
Pero, uno podría anular el método de normalización, por lo que intercepté en este punto, simplemente desarmando la propiedad que hace referencia a "Ubicación", por lo que el ciclo infinito se interrumpe.
En el código se ve así:
fuente
Tuve el mismo problema y decidí crear mi propio codificador, que se encargará por sí mismo de la recursividad.
Creé clases que implementan
Symfony\Component\Serializer\Normalizer\NormalizerInterface
y un servicio que contiene cadaNormalizerInterface
.Un ejemplo de normalizador:
En un controlador:
El código completo está aquí: https://github.com/progracqteur/WikiPedale/tree/master/src/Progracqteur/WikipedaleBundle/Resources/Normalizer
fuente
en Symfony 2.3
/app/config/config.yml
y ejemplo para su controlador:
pero los problemas con el tipo de campo \ DateTime permanecerán.
fuente
Esto es más una actualización (para Symfony v: 2.7+ y JmsSerializer v: 0.13. * @ Dev) , para evitar que Jms intente cargar y serializar todo el gráfico de objetos (o en caso de relación cíclica ..)
Modelo:
Dentro de una acción:
fuente
Si está utilizando Symfony 2.7 o superior , y no desea incluir ningún paquete adicional para serializar, tal vez pueda seguir esta forma para seializar entidades de doctrine a json:
En mi controlador (común, principal), tengo una función que prepara el serializador
Luego úselo para serializar Entidades a JSON
¡Hecho!
Pero es posible que necesite algunos ajustes. Por ejemplo -
fuente
Cuando necesite crear muchos puntos finales de API REST en Symfony, la mejor manera es utilizar la siguiente pila de paquetes:
Cuando configure todo correctamente, el código de su entidad se verá así:
Luego, codifique en el controlador:
Los beneficios de dicha configuración son:
fuente
Ahora también puede usar Doctrine ORM Transformations para convertir entidades en matrices anidadas de escalares y viceversa.
fuente