【问题标题】:JMSSerializerBundle: specify group per attributeJMSSerializerBundle:为每个属性指定组
【发布时间】:2012-11-19 20:43:10
【问题描述】:

我正在使用 Symfony2 和 JMSSerializerBundle 来构建 API。 JMSSerializer 提供的用于设置使用组序列化对象的不同方式的系统非常有用,但是,我缺少一种方法来指定要在每个参数中序列化哪个组。示例:

我有一篇与用户(作者)相关的文章。文章和用户可以序列化为“列表”或“详细信息”,但是,我希望用户始终被序列化为“列表”,因为它们是从文章中检索的(因为“详细信息”组保留使用获取用户并且只获取用户)。问题是如果我将序列化器设置为“details”,那么作者也被序列化为“details”。

在我看来,代码应该是这样的:

/**
 * @var SCA\APIBundle\Entity\User
 * @Groups({"list" => "list", "details" => "list"})
 */
private $author;

其中数组的key表示parent应该被序列化的方式,value表示child应该被序列化的方式。

有什么办法可以做到这一点吗?

【问题讨论】:

    标签: php symfony jmsserializerbundle


    【解决方案1】:

    不应该在组合对象上做,而是在组合上做。

    在你的情况下,我想你有这样的事情:

    class Article
    {
        /**
         * @var User
         * @Groups({"list", "details"})
         */
        private $author;
    }
    
    
    class User
    {
        private $firstName;
        private $lastName;
    }
    

    所以如果想在序列化组合对象时暴露firstName属性,需要在User对象中定义相同的组。

    变成:

    class Article
    {
        /**
         * @var User
         * @Groups({"list", "details"})
         */
        private $author;
    }
    
    
    class User
    {
        /*
         * @Groups({"list"})
         */
        private $firstName;
        private $lastName;
    }
    

    如果您需要更多控制,您可以定义更明确的组,例如“article-list”、“user-firstname”、“user-list-minimal”等。

    由您决定采用的最佳策略。

    【讨论】:

    • 是的,这就是我将要使用的解决方案,但我认为应该有其他方法来实现这一点,因为如果你有大量的这种方法有点难以维护类。
    • @aperezroca,我同意这可能有点违反直觉,但我想这是由于排除策略的工作方式存在一些限制(反思)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2010-09-26
    • 1970-01-01
    • 2018-06-28
    • 2011-04-20
    相关资源
    最近更新 更多