阻止对某些属性使用符号序列化程序


Prevent symfony serializer to certain attributes

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

我有一个实体产品,其属性为"价格"(与另一个实体相关)和"补充"(这是一种自参考关系)。当我得到一个产品时,我需要价格,但当列出补码时,我不需要补码产品中的价格,有什么方法可以避免只在补码中得到属性价格吗?类似的东西

$normalizer->setIgnoredAttributes(array('complement->prices'));

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

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

序列化组

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

序列化时,可以通过$context数组指定要序列化的序列化组,并且序列化程序将仅序列化该组的成员。

NormalizableInterface

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

通过在$context数组中传递一些信息/标志,可以确保产品实体的规范化逻辑知道它当前是在规范化标准产品还是补码。

自定义规范化器类

不必在实体上实现NormalizableInterface,您的新规范化器类将只接受规范化Product实体(或您决定在supportsNormalization中指定的任何实体)。

与前面的示例一样,这里必须应用相同的$context逻辑。

如果您需要将属性完全排除在序列化之外,那么由于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 {}
}