JMSSerializer - 通过条件

问题描述:

排除属性我已经创建了一个Symfony3实体,像这样(缩短):JMSSerializer - 通过条件

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

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

在路线[GET] list/groups,这是好的,因为它应该生成包含每个项目只能包含一个列表id和名字。

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

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

UPDATE

由于@Genoud马格洛伊尔的答案,我可以想办法做到这一点,像这样:

use FOS\RestBundle\Context\Context; 

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

return $this->handleView($view); 

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

+0

谢谢,成功了! – philipp

版本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; 
} 
+0

你能提供一个没有服务的例子吗?我找不到任何用于此功能的例子,期望像“true”或某些虚拟方法这样的表达式。 – Erfan

+0

在“if”里面你可以把https://symfony.com/doc/current/components/expression_language.html –

+1

上显示的任何表达谢谢。我已经阅读过这篇文章。我的问题是由JMS Serializer组合。例如,如何检查表达式中的当前深度(访问上下文);或者我如何检查其他属性(访问当前对象)。在[documentation]中(https://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#dynamic-exclusion-strategy)就是这个例子:'@Exclude(if =“someMethod(object,context,property_metadata)” )'。但是没有信息我们如何/在哪里可以定义这个功能。 – Erfan