Estou desenvolvendo um aplicativo de jogo e usando Symfony 2.0. Tenho muitas solicitações AJAX para o back-end. E mais respostas está convertendo entidade em JSON. Por exemplo:
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');
}
}
E todos os meus controladores fazem a mesma coisa: obtêm uma entidade e codificam alguns de seus campos para JSON. Eu sei que posso usar normalizadores e codificar todas as entidades. Mas e se uma entidade tiver um ciclo de links para outra entidade? Ou o gráfico de entidades é muito grande? Você tem alguma sugestão?
Eu penso em algum esquema de codificação para entidades ... ou usando NormalizableInterface
para evitar ciclos ...,
fonte
Com php5.4 agora você pode fazer:
E então ligue
fonte
OneToMany
relações)Você pode codificar automaticamente em Json, sua entidade complexa com:
fonte
Para completar a resposta: Symfony2 vem com um wrapper em torno de json_encode: Symfony / Component / HttpFoundation / JsonResponse
Uso típico em seus controladores:
Espero que isto ajude
J
fonte
Descobri que a solução para o problema de serialização de entidades foi a seguinte:
no meu controlador:
outro exemplo:
você pode até configurá-lo para desserializar matrizes em http://api.symfony.com/2.0
fonte
Eu apenas tive que resolver o mesmo problema: codificação json de uma entidade ("Usuário") tendo uma Associação Bidirecional Um-para-Muitos para outra Entidade ("Local").
Tentei várias coisas e acho que agora encontrei a solução mais aceitável. A ideia era usar o mesmo código escrito por David, mas de alguma forma interceptar a recursão infinita dizendo ao Normalizador para parar em algum ponto.
Eu não queria implementar um normalizador personalizado, já que GetSetMethodNormalizer é uma boa abordagem na minha opinião (com base em reflexão, etc.). Portanto, decidi criar uma subclasse, o que não é trivial à primeira vista, porque o método para dizer se incluir uma propriedade (isGetMethod) é privado.
Mas, alguém poderia sobrescrever o método normalize, então eu interceptei neste ponto, simplesmente desmarcando a propriedade que faz referência a "Location" - então o loop infinito é interrompido.
No código, é assim:
fonte
Eu tive o mesmo problema e optei por criar meu próprio codificador, que irá lidar sozinho com a recursão.
Eu criei classes que implementam
Symfony\Component\Serializer\Normalizer\NormalizerInterface
e um serviço que contém todosNormalizerInterface
.Um exemplo de Normalizador:
Em um controlador:
O código completo está aqui: https://github.com/progracqteur/WikiPedale/tree/master/src/Progracqteur/WikipedaleBundle/Resources/Normalizer
fonte
no Symfony 2.3
/app/config/config.yml
e exemplo para o seu controlador:
mas os problemas com o tipo de campo \ DateTime permanecerão.
fonte
Esta é mais uma atualização (para Symfony v: 2.7+ e JmsSerializer v: 0.13. * @ Dev) , para evitar que Jms tente carregar e serializar todo o gráfico do objeto (ou no caso de relação cíclica ..)
Modelo:
Dentro de uma ação:
fonte
Se você estiver usando Symfony 2.7 ou superior e não quiser incluir nenhum pacote adicional para serialização, talvez você possa seguir este caminho para serializar entidades de doutrina para json -
No meu controlador (pai comum), tenho uma função que prepara o serializador
Em seguida, use-o para serializar entidades para JSON
Feito!
Mas você pode precisar de alguns ajustes. Por exemplo -
fonte
Quando você precisa criar muitos endpoints da API REST no Symfony, a melhor maneira é usar a seguinte pilha de pacotes:
Quando você configurar tudo corretamente, seu código de entidade terá a seguinte aparência:
Então, codifique no controlador:
Os benefícios dessa configuração são:
fonte
Agora você também pode usar Doctrine ORM Transformations para converter entidades em matrizes aninhadas de escalares e vice-versa
fonte