php - JMSSerializer 分组属性的交集

标签 php symfony jmsserializerbundle jms-serializer

我有如下实体:

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/

相关文章:

php - 在 codeigniter 中发布后,多选不保留值

php - 交响乐团 5 : An unexpected value could not be normalized: stream resource

php - Symfony 4 Doctrine LifecycleEventArgs getEntity() 与 getObject()

php - Symfony 断言日期时间 JMSSerializer

php - JMSSerializer 和 FOSRestBundle - 注释不起作用。 "Does not exist"

php - 我的 sql 查询中的错误

php - 将内容部署到多个服务器 (EC2)

symfony - PreUpdate 级联实体持久化 symfony 2.3

php - HWIOAuthBundle 第一个示例的问题

symfony - JMSSerializerBundle 复杂生成值