【问题标题】:JMS Serializer serialize object in object with diffrent viewJMS Serializer 用不同的视图序列化对象中的对象
【发布时间】:2015-07-30 08:05:14
【问题描述】:

我正在使用 Symfony2、JMS Serializer BundleFOS Rest BundleHateoas Bundle 开发 RESTful 服务。有 2 个实体用户和公司,我想在序列化公司时获得更多细节。 但是,在序列化用户相关公司时,仅显示公司 ID 和名称对象或仅将 ID 显示为整数。

我有如下的序列化策略。

用户

Acme\UserBundle\Entity\User:
exclusion_policy: ALL
xml_root_name: user
properties:
    id:
        expose: true
        type: integer
    company:
        expose: true
        type: Acme\CompanyBundle\Entity\Company
    name:
        expose: true
        type: string
    surname:
        expose: true
        type: string
    picture:
        expose: true
        type: string
relations:
    -
        rel: self
        href:
            route: acme_v1_get_user
            parameters:
                id: expr(object.getId())
            absolute: true

公司

Acme\CompanyBundle\Entity\Company:
exclusion_policy: ALL
xml_root_name: company
properties:
    id:
        expose: true
        type: integer
    name:
        expose: true
        type: string
    address:
        expose: true
        type: string
    phone:
        expose: true
        type: string
    web:
        expose: true
        type: string
    created_date:
        expose: true
        type: DateTime
    updated_date:
        expose: true
        type: DateTime
    status:
        expose: true
        type: integer
relations:
    -
        rel: self
        href:
            route: acme_v1_get_company
            parameters:
                id: expr(object.getId())
            absolute: true

预期输出

{
  "id": 1,
  "name": "Jenny",
  "surname": "Doe",
  "picture": "http://google.com/kittens.jpg",
  "info": [],
  "company": {
    "id": 1,
    "name": "Demo Company"
  }
}

{
  "id": 1,
  "name": "Jenny",
  "surname": "Doe",
  "picture": "http://google.com/kittens.jpg",
  "info": [],
  "company": 1
}

我得到了什么

{
  "id": 1,
  "name": "Jenny",
  "surname": "Doe",
  "picture": "http://google.com/kittens.jpg",
  "info": [],
  "company": {
    "id": 1,
    "name": "Demo Company",
    "address": "Lorem ipsum dolor sit amet",
    "phone": "0902124440444",
    "web": "http://www.demo-company.com",
    "created_date": "2015-07-22T11:21:03+0300",
    "updated_date": "2015-07-24T01:50:39+0300",
    "status": 1
  }
}

【问题讨论】:

    标签: symfony serialization fosrestbundle jmsserializerbundle jms-serializer


    【解决方案1】:

    您可以使用群组

    AppBundle\Entity\User\User:
        exclusion_policy: ALL
        properties:
            lastname:
                expose: true
                groups: [info]
    

    通过注释,您可以定义在哪个组上显示哪个属性。最后,您可以为您使用的每条路线分配一个组。

    或者你可以像这样使用虚拟属性:

    AppBundle\Entity\User\User:
        exclusion_policy: ALL
        properties:
             […]
        virtual_properties:
            getCompanyId:
                serialized_name: company
                type: string
                groups: [info]
    

    然后您在 User 实体中创建一个 getCompanyId() 方法,该方法返回 companyId

    【讨论】:

    • 谢谢你,为我分组工作。我创建了一个默认组,用于显示每个序列化过程和一个序列化所有者相关组,例如。用户控制器序列化的用户组或公司控制器的公司组。这样,当我从公司激活公司组进行序列化时,可以获得完整的详细信息,但从另一家公司相关的序列化只显示默认组。有没有更好的方法来做到这一点,或者这是常见的方法?
    • 我刚开始序列化,所以不知道有没有更好的方法,但我会这样做
    【解决方案2】:

    更多的 Hateoas 方法是使用关系。

    Acme\UserBundle\Entity\User:
    exclusion_policy: ALL
    xml_root_name: user
    properties:
        id:
            expose: true
            type: integer
        name:
            expose: true
            type: string
        surname:
            expose: true
            type: string
        picture:
            expose: true
            type: string
    relations:
        -
            rel: self
            href:
                route: acme_v1_get_user
                parameters:
                    id: expr(object.getId())
                absolute: true
        -
            rel: company
            href:
                route: acme_v1_get_company
                parameters:
                    id: expr(object.getCompany().getId())
                absolute: true
    

    会产生...

    {
      "id": 1,
      "name": "Jenny",
      "surname": "Doe",
      "picture": "http://google.com/kittens.jpg",
      "info": []
      "_links": {
        "self": {
          "href": "http://server.com/api/user/1"
        },
        "company": {
          "href": "http://server.com/api/company/1"
        },
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2013-06-20
      • 2015-08-03
      • 2019-07-26
      • 2012-09-13
      相关资源
      最近更新 更多