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);
版本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;
}
你能提供一个没有服务的例子吗?我找不到任何用于此功能的例子,期望像“true”或某些虚拟方法这样的表达式。 – Erfan
在“if”里面你可以把https://symfony.com/doc/current/components/expression_language.html –
上显示的任何表达谢谢。我已经阅读过这篇文章。我的问题是由JMS Serializer组合。例如,如何检查表达式中的当前深度(访问上下文);或者我如何检查其他属性(访问当前对象)。在[documentation]中(https://jmsyst.com/libs/serializer/master/cookbook/exclusion_strategies#dynamic-exclusion-strategy)就是这个例子:'@Exclude(if =“someMethod(object,context,property_metadata)” )'。但是没有信息我们如何/在哪里可以定义这个功能。 – Erfan
谢谢,成功了! – philipp