首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FOSRestBundle不使用JMSSerializerBundle

FOSRestBundle不使用JMSSerializerBundle
EN

Stack Overflow用户
提问于 2017-07-16 17:10:49
回答 1查看 989关注 0票数 0

我已经将Symfony 3配置为自动序列化我的操作。它可以工作,但是关系没有序列化:

代码语言:javascript
复制
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是一个对象):

代码语言:javascript
复制
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:

代码语言:javascript
复制
/**
 * @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;
 }

我序列化的实体:

代码语言:javascript
复制
/**
 * 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;

我的配置:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

发布于 2017-07-18 19:40:46

首先,您需要在config.yml中配置JMSSerializer,如下所示:

代码语言:javascript
复制
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创建目录,代码如下:

代码语言:javascript
复制
YourBundleName\Entity\Project:
    exclusion_policy: ALL
    properties:
        id:
            expose: true
        name:
            expose: true

"exclusion_policy: ALL“-从序列化结果中排除所有字段。然后使用"expose: true“添加所需的字段。只要不在那里添加"ParentEntity“,您就不会在序列化的数据中看到它(而且,我不认为camel和pascal的混合用例是一种很好的做法,但这是品味的问题)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45126896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档