我承认$ normalizer-> setIgnoredAttributes的存在,但我有以下问题。
我有一个实体产品,其中包含属性'价格' (与另一实体相关)和补充' (这是一种自我参照关系)。当我得到一个产品时我需要价格,但是当列出补充品时,我不需要补充产品中的价格,有没有办法避免仅在补充品中获得属性价格?像
这样的东西$normalizer->setIgnoredAttributes(array('complement->prices'));
答案 0 :(得分:5)
NormalizableInterface
Product
实体的自定义规范化器类。通过对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 {}
}