JMSSerializer - 按条件排除属性

时间:2017-02-24 11:09:13

标签: symfony jmsserializerbundle

我创建了一个像这样(缩短)的Symfony3实体:

class Group
{
  /**
   * …
   */
  private name;

  /**
   * …
   *@JMS\Exclude()
   */
  private $styles;
}

在路由[GET] list/groups上,这很好,因为它应该生成一个列表,其中包含每个Item应该只包含id和名称的位置。

但是在路线[GET] group/{id}上,我想向客户提供更多详细信息,包括样式等。

如何通过条件/路由排除/包含实体的属性?

更新

感谢@Genoud Magloire的回答,我可以这样做:

use FOS\RestBundle\Context\Context;

$view = $this->view($group);
$context = new Context();
$context->addGroup('detail');
$view->setContext($context);

return $this->handleView($view);

2 个答案:

答案 0 :(得分:2)

您可以使用@Group注释作为解释Here来创建对象的不同视图。

答案 1 :(得分:2)

版本v1.5中的另一种方法是按表达式语言排除。

访问https://github.com/schmittjoh/serializer/pull/673您可以看到如何使用任何服务调用排除属性。

基本上是:

class Person
{
    /**
     * @Expose(if="service('some.cool.service').isAllowed(object)")
     */
    public $gender;
    /**
     * @Exclude(if="service('some.cool.service').isAllowed(object)")
     */
    public $gender;
}