我有如下实体:
class A
{
/**
* @JMS\Groups({"writable", "other"})
*/
private $varA;
/**
* @JMS\Groups({"writable"})
*/
private $varB;
/**
* @JMS\Groups({"other"})
*/
private $varC;
}
我想让序列化器为两个组中存在的属性生成输出,所以简单地说,我需要分组属性的交集。
$context = SerializationContext::create()->setGroups(['writable' ,'other']);
$serializer->serialize(new A(), 'json', $context);
上面的代码应该只输出变量$varA
,因为它定义了两个组。
如何实现?我唯一想到的是扩展来自 JMSSerializer 的 GroupExclusionStategy 但也许有更好的方法?
最佳答案
也许一个简单的解决方案可以将另一个组名称(“独占”)添加到 $varA
属性:
/**
* @JMS\Groups({"writable", "other", "exclusive"})
*/
private $varA;
后跟:
$context = SerializationContext::create()->setGroups('exclusive');
但这可能只是一个示例用例。换句话说,应该创建一个 CustomGroupsExclusionStrategy()
。
默认情况下,GroupsExclusionStrategy()
检查是否有任何属性组包含在请求的组中:
private function shouldSkipUsingGroups(PropertyMetadata $property, $groups)
{
foreach ($property->groups as $group) {
if (in_array($group, $groups)) {
return false;
}
}
return true;
}
因此,要做到这一点,您需要将其更改为:
private function shouldSkipUsingGroups(PropertyMetadata $property, $groups)
{
foreach ($groups as $group) {
if (!in_array($group, $property->groups)) {
return true;
}
}
return false;
}
因此,所有请求的组都必须包含在属性组中。
解决方案:
https://gist.github.com/yceruto/90b1ac46c8e33d51ec21079725949f77
我在这里留下了使用标记“严格”策略的实现:
$context = SerializationContext::create();
$context->addExclusionStrategy(
new CustomGroupsExclusionStrategy(['writable', 'other'], true)
);
$json = $this->get('serializer')->serialize(new A(), 'json', $context);
输出:
{"varA":"foo"}
关于php - JMSSerializer 分组属性的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40765252/