我正在开发游戏应用程序和使用Symfony 2.0。我有很多AJAX请求到后端。更多的响应是将实体转换为JSON。例如:
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');
}
}
所有我的控制器做同样的事情:获得一个实体,并将其某些字段编码为JSON。我知道我可以使用规范化和编码所有的权限。但是如果一个实体循环链接到其他实体呢?还是实体图很大?你有什么建议吗?
我想到一些编码架构的实体…或使用normalizableInterface避免循环..,
另一个选择是使用
JMSSerializerBundle.然后在你的控制器中
$serializer = $this->container->get('serializer');
$reports = $serializer->serialize($doctrineobject,'json');
return new Response($reports); // should be $reports as $doctrineobject is not serialized
您可以通过使用实体类中的注释来配置如何完成序列化。请参阅上面链接中的文档。例如,以下是排除关联实体的方法:
/**
* 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;