59 votos

Cómo codificar la Doctrina entidades a JSON en Symfony 2.0 aplicación AJAX?

Estoy desarrollando la app de juegos y el uso de Symfony 2.0. Tengo muchas peticiones AJAX al servidor. Y más respuestas es la conversión de la entidad en 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 a todos mis controladores de hacer la misma cosa: conseguir una entidad y codificar algunos de sus campos a JSON. Sé que se puede utilizar normalizadores y codificar todos los entitities. Pero ¿qué pasa si una entidad ha subido los enlaces a otra entidad? O de las entidades gráfica es muy grande? ¿Tiene alguna sugerencia?

Pienso en algunos esquema de codificación para las entidades... o el uso de NormalizableInterface para evitar la bicicleta..,

108voto

SparSio Puntos 611

Con php5.4 ahora usted puede hacer :

use JsonSerializable;

/**
* @Entity(repositoryClass="App\Entity\User")
* @Table(name="user")
*/
class MyUserEntity implements JsonSerializable
{
    /** @Column(length=50) */
    private $name;

    /** @Column(length=50) */
    private $login;

    public function jsonSerialize()
    {
        return array(
            'name' => $this->name,
            'login'=> $this->login,
        );
    }
}

Y, a continuación, llamar a

json_encode(MyUserEntity);

60voto

sofia Puntos 2499

Otra opción es utilizar el JMSSerializerBundle. En el controlador, a continuación, hacer

$serializer = $this->container->get('serializer');
$reports = $serializer->serialize($doctrineobject, 'json');
return new Response($reports); // should be $reports as $doctrineobject is not serialized

Usted puede configurar la forma en que la serialización se realiza mediante el uso de anotaciones en la clase de entidad. Consulte la documentación en el enlace de arriba. Por ejemplo, aquí es cómo usted podría excluir a entidades vinculadas:

 /**
* Iddp\RorBundle\Entity\Report
*
* @ORM\Table()
* @ORM\Entity(repositoryClass="Iddp\RorBundle\Entity\ReportRepository")
* @ExclusionPolicy("None")
*/
....
/**
* @ORM\ManyToOne(targetEntity="Client", inversedBy="reports")
* @ORM\JoinColumn(name="client_id", referencedColumnName="id")
* @Exclude
*/
protected $client;

31voto

webda2l Puntos 3057

Automáticamente se puede codificar en Json, su entidad compleja con:

use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer;
use Symfony\Component\Serializer\Encoder\JsonEncoder;

$serializer = new Serializer(array(new GetSetMethodNormalizer()), array('json' => new 
JsonEncoder()));
$json = $serializer->serialize($entity, 'json');

8voto

jerome Puntos 96

Para completar la respuesta: Symfony2 viene con una envoltura alrededor de json_encode: Symfony/Componente/HttpFoundation/JsonResponse

El uso típico de los Controladores:

...
use Symfony\Component\HttpFoundation\JsonResponse;
...
public function acmeAction() {
...
return new JsonResponse($array);
}

Espero que esto ayude

J

7voto

rkmax Puntos 3436

He encontrado la solución al problema de serializar entidades fue de la siguiente manera:

#config/config.yml

services:
    serializer.method:
        class: Symfony\Component\Serializer\Normalizer\GetSetMethodNormalizer
    serializer.encoder.json:
        class: Symfony\Component\Serializer\Encoder\JsonEncoder
    serializer:
        class: Symfony\Component\Serializer\Serializer
        arguments:
            - [@serializer.method]
            - {json: @serializer.encoder.json }

en mi controlador:

$serializer = $this->get('serializer');

$entity = $this->get('doctrine')
               ->getRepository('myBundle:Entity')
               ->findOneBy($params);


$collection = $this->get('doctrine')
               ->getRepository('myBundle:Entity')
               ->findBy($params);

$toEncode = array(
    'response' => array(
        'entity' => $serializer->normalize($entity),
        'entities' => $serializer->normalize($collection)
    ),
);

return new Response(json_encode($toEncode));

otro ejemplo:

$serializer = $this->get('serializer');

$collection = $this->get('doctrine')
               ->getRepository('myBundle:Entity')
               ->findBy($params);

$json = $serializer->serialize($collection, 'json');

return new Response($json);

incluso puedes configurarlo para deserializar matrices en http://api.symfony.com/2.0

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X