我希望我的序列化过程是显式的,不使用对象/属性规格化程序,我如何注销它们?
http://symfony.com/doc/current/components/serializer.html#normalizers
发布于 2018-05-04 23:40:18
我找到了一种在Kernel::build中添加编译器通道的方法
class Kernel extends BaseKernel
{
// ...
protected function build(ContainerBuilder $container)
{
$container->addCompilerPass(new class implements CompilerPassInterface
{
public function process(ContainerBuilder $container)
{
$container->removeDefinition('serializer.normalizer.json_serializable');
$container->removeDefinition('serializer.normalizer.object');
}
}, PassConfig::TYPE_BEFORE_OPTIMIZATION, 1);
}
}优先级=1使其在SerializerPass之前运行,因此它可以工作。
更新:@Nek的建议是在framework配置中禁用序列化程序,然后自己注册它似乎是一个好主意。
发布于 2018-05-05 00:15:11
如果您希望您的序列化过程是显式的,您可以在服务definition中注册您自己的规范器,如下所示
AppBundle\Serializer\Your\MyObjectNormalizer:
tags:
- { name: serializer.normalizer }您可以像下面这样声明一个规范化程序
namespace AppBundle\Serializer\Your;
use Symfony\Component\Serializer\Normalizer\NormalizerInterface;
class MyObjectNormalizer implements NormalizerInterface
{
public function normalize($object, $format = null, array $context = [])
{
// $object is an instance of MyObject
$groups = array_key_exists('groups', $context) ? $context['groups'] : [];
$data = [
'name' => $object->getName()
// ..........
];
if(array_key_exists('full', $groups)) {
$data['owner'] = $object->getOwner()->getFullName();
}
return $data;
}
/**
* Checks whether the given class is supported for normalization by this normalizer.
*
* @param mixed $data Data to normalize
* @param string $format The format being (de-)serialized from or into
*
* @return bool
*/
public function supportsNormalization($data, $format = null)
{
return $data instanceof MyObject;
}
}如果你像这样处理,Symfony会看到你为这类对象声明了一个自定义的规格化器。所以他会把你的课放在第一位让MyObject正常化
您可以标准化上下文数组中的数据
$myobject = new MyObject();
$fullObj = $this->container->get('serializer')->serialize($myobject, 'json', ['full']);
$lightObj = $this->container->get('serializer')->serialize($myobject, 'json');
// $fullObj is ['name' => 'someName', 'owner' => 'ownerName'];
// $lightObj is ['name' => 'someName'];看一下documentation的这一部分
https://stackoverflow.com/questions/50178432
复制相似问题