防止symfony序列化程序达到某些属性

时间:2016-04-14 10:18:15

标签: php symfony

我承认$ normalizer-> setIgnoredAttributes的存在,但我有以下问题。

我有一个实体产品,其中包含属性'价格' (与另一实体相关)和补充' (这是一种自我参照关系)。当我得到一个产品时我需要价格,但是当列出补充品时,我不需要补充产品中的价格,有没有办法避免仅在补充品中获得属性价格?像

这样的东西
$normalizer->setIgnoredAttributes(array('complement->prices'));

2 个答案:

答案 0 :(得分:5)

有几种方法可以实现这一目标:

  1. 使用Serializer注释并指定不同的序列化组
  2. 使用CustomNormalizer并使您的产品实现NormalizableInterface
  3. 编写一个仅支持Product实体的自定义规范化器类。
  4. 序列化组

    通过对Product实体的每个属性使用注释,您可以指定是否应该序列化该属性,是否需要别名,或者它是否属于一个或多个组。

    序列化时,您可以通过$context数组指定要序列化的序列化组,序列化程序只会序列化该组的成员。

    NormalizableInterface

    通过在NormalizableInterface实体中实施Product,您将规范化的责任传递给实体本身。它决定最终标准化产品的外观。

    通过在$context数组中传递一些信息/标志,您可以确保产品实体的规范化逻辑能够了解它是否正在标准化标准产品或补充。

    自定义规范化程序类

    无需在实体上实施NormalizableInterface,您的新规范化器类只接受规范化Product实体(或您在supportsNormalization中指定的任何内容)。

    此处必须使用与前一个示例相同的$context逻辑。

答案 1 :(得分:-1)

如果你需要完全排除一个属性被序列化,那么自 Symfony 5.1 版起你有一个更简单的选择:@Ignore 注释:

例如:

use Symfony\Component\Serializer\Annotation\Ignore;

class User
{
    public $login;
    public $email;

    /**
     * @Ignore
     */
    public $password;
}

它也适用于访问方法:

class User
{
    // ...
    
    /**
     * @Ignore
     */
    public function getPassword(): string {}

    /**
     * @Ignore
     */
    public function isAdmin(): bool {}
}