Php JMSSerializerBundle:为每个属性指定组

Php JMSSerializerBundle:为每个属性指定组,php,symfony,jmsserializerbundle,Php,Symfony,Jmsserializerbundle,我正在使用Symfony2和JMSSerializerBundle构建一个API。JMSSerializer提供的用于设置使用组序列化对象的不同方式的系统非常有用,但是,我缺少一种方法来指定要在每个参数中序列化哪个组。例如: 我有一篇与用户作者相关的文章。文章和用户可以序列化为列表或详细信息,但是,我希望将用户序列化为列表,并始终从文章中检索它们,因为详细信息组保留用于获取用户,而仅用于获取用户。问题是,如果我将序列化程序设置为details,那么作者也会被序列化为details 在我看来,代码

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

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

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

/**
 * @var SCA\APIBundle\Entity\User
 * @Groups({"list" => "list", "details" => "list"})
 */
private $author;
其中,数组的键指示父级序列化的方式,值指示子级序列化的方式


有什么线索可以让我做到这一点吗?

不应该在合成对象上进行,而应该在合成对象上进行

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

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


class User
{
    private $firstName;
    private $lastName;
}
因此,如果要在序列化组合对象时公开firstName属性,则需要在用户对象中定义相同的组

它变成:

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


class User
{
    /*
     * @Groups({"list"})
     */
    private $firstName;
    private $lastName;
}
如果您需要更多的控制,您可以定义更显式的组,如文章列表、用户名、用户列表最小值等


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

是的,这是我将要使用的解决方案,但我认为应该有其他方法来实现这一点,因为如果您有大量的类,这种方法有点难以维护。@aperezroca,我同意这可能有点违反直觉,但我想这是因为排除策略的工作方式有一些限制