【问题标题】:FOSRestBundle not use JMSSerializerBundleFOSRestBundle 不使用 JMSSerializerBundle
【发布时间】:2017-12-20 23:12:57
【问题描述】:

我已将 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 使用默认的序列化程序,而不是 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?

【问题讨论】:

    标签: symfony fosrestbundle jmsserializerbundle


    【解决方案1】:

    首先,您需要在 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”,您将不会在序列化数据中看到它(另外,我认为骆驼和帕斯卡大小写的混合不是一个好习惯,但这是品味问题)。

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多