我已经将Symfony 3配置为自动序列化我的操作。它可以工作,但是关系没有序列化:
0
id 1
name "Liste de course"
creation_date "2017-07-07T00:00:00+00:00"
last_update_date "2017-07-07T20:57:06+00:00"
user_entity
_todo_entity_entities
_parent_entity
1
id 2
name "domotique"
creation_date "2017-07-07T00:00:00+00:00"
last_update_date "2017-07-07T21:22:52+00:00"
user_entity
_todo_entity_entities
_parent_entity如果我显式地使用JMSSerializerBundle,它就可以工作(user_entity是一个对象):
0
id 1
name "Liste de course"
creation_date "2017-07-07T00:00:00+00:00"
last_update_date "2017-07-07T20:57:06+00:00"
user_entity Object
_todo_entity_entities
1
id 2
name "domotique"
creation_date "2017-07-07T00:00:00+00:00"
last_update_date "2017-07-07T21:22:52+00:00"
user_entity Object
_todo_entity_entities我认为FOSRestBundle使用的是默认的seralizer,而不是JMSSerializerBundle:
/**
* @Rest\Get("/projects")
* @View(
* serializerGroups = {"all"}
* )
*/
public function getProjectsAction()
{
$projectEntity = $this->getDoctrine()->getRepository('todoListAdminBundle:Project');
$projects = $projectEntity->findAll();
/*
$data = $this->get('jms_serializer')->serialize($projects, 'json');
// this is work !
$response = new Response($data);
$response->headers->set('Content-Type', 'application/json');
return $response;
*/
return $projects;
}我序列化的实体:
/**
* Project
*
* @ORM\Table(name="project")
* @ORM\Entity(repositoryClass="todoListAdminBundle\Repository\ProjectRepository")
*/
class Project
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
* @Serializer\Groups({"all"})
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="name", type="string", length=255)
* @Assert\Length(max=50)
* @Assert\Type(type="string")
* @Serializer\Groups({"all"})
*/
private $name;
/**
* @var \DateTime
*
* @ORM\Column(name="creation_date", type="date")
* @Assert\DateTime()
* @Serializer\Groups({"all"})
*/
private $creationDate;
/**
* @var \DateTime
*
* @ORM\Column(name="last_update_date", type="datetime")
* @Assert\DateTime()
* @Serializer\Groups({"all"})
*/
private $lastUpdateDate;
/**
*
* @ORM\ManyToOne(targetEntity="PW\UserBundle\Entity\User", inversedBy="projectEntities" , cascade={"persist"}, inversedBy="projectEntities")
* @Assert\Type(type="integer")
* @Serializer\Groups({"all"})
*/
private $userEntity;
/**
* @ORM\OneToMany(targetEntity="todoListAdminBundle\Entity\TodoEntity", mappedBy="projectEntity", fetch="EAGER")
* @Serializer\Groups({"all"})
*/
private $TodoEntityEntities;
/**
* @var int
*
* @ORM\JoinColumn(nullable=true, referencedColumnName="id")
* @ORM\OneToOne(targetEntity="todoListAdminBundle\Entity\Project")
* @Assert\Type(type="integer")
* @Serializer\Groups({"all"})
*/
private $ParentEntity;我的配置:
fos_rest:
param_fetcher_listener: true
body_listener: true
zone:
- { path: ^/api/* }
body_converter:
enabled: true
view:
formats: { json: true, xml: false, rss: false }
view_response_listener: true
serializer:
serialize_null: true
format_listener:
enabled: true
rules:
- { path: '^/api', priorities: ['json'], fallback_format: 'json' }
routing_loader:
default_format: json
sensio_framework_extra:
view: { annotations: true }如何自动使用JMSSerializerBundle?
发布于 2017-07-18 19:40:46
首先,您需要在config.yml中配置JMSSerializer,如下所示:
jms_serializer:
metadata:
cache: file
debug: "%kernel.debug%"
file_cache:
dir: "%kernel.cache_dir%/serializer"
auto_detection: true 然后,使用序列化程序为给定的实体YourBundleName/Resources/config/serializer/Entity.Project.yml创建目录,代码如下:
YourBundleName\Entity\Project:
exclusion_policy: ALL
properties:
id:
expose: true
name:
expose: true"exclusion_policy: ALL“-从序列化结果中排除所有字段。然后使用"expose: true“添加所需的字段。只要不在那里添加"ParentEntity“,您就不会在序列化的数据中看到它(而且,我不认为camel和pascal的混合用例是一种很好的做法,但这是品味的问题)。
https://stackoverflow.com/questions/45126896
复制相似问题