我试图通过jmsserializer在pre_deserialization上执行我的Document的__constructor,但我不知道它为什么不起作用。
我正在从yaml文件加载序列化程序元数据,如下所示:
AppBundle\Document\Campaign:
exclusion_policy: ALL
xml_root_name: campaign
properties:
id:
type: string
expose: true
slug:
type: string
expose: true
name:
type: string
expose: true
callback_methods:
pre_deserialize: [__construct]
当我尝试反序列化执行时:
$object = $serializer->deserialize($jsonString, 'AppBundle\\Document\\Campaign', 'json');
我无法访问构造函数,但是如果我将事件更改为任何其他可用的事件(pre_serialize,post_serialize和post_deserialize),我会这样做。
我认为缺少有关此特定事件处理的代码,但是尝试复制影响其他事件的相同代码仍然无效。 看起来它从未在事件调度程序或类似事件中注册。
我的环境是:
symfony 2.6.3
jms/serializer 0.16.0
jms/serializer-bundle 0.13.0
感谢。
答案 0 :(得分:2)
我可以验证这似乎是JMS Serializer中的错误。出于某种原因,服务容器没有读取pre_deserialize事件并将其注册到JMS。
但是,您可以使用事件订阅者解决此问题。
首先定义Subscriber类,类似于您的侦听器:
<?php
namespace Acme\AcmeBundle\Listener;
use JMS\Serializer\EventDispatcher\PreDeserializeEvent;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
class SerializationSubscriber implements EventSubscriberInterface
{
/**
* @inheritdoc
*/
static public function getSubscribedEvents()
{
return array(
array('event' => 'serializer.pre_deserialize', 'method' => 'onPreDeserialize'),
);
}
public function onPreDeserialize(PreDeserializeEvent $event)
{
echo "we're about to de-cerealizing";
}
}
然后在捆绑包的服务配置中注册订阅者:
parameters:
acme.serializer_subscriber.class: Acme\AcmeBundle\Listener\SerializationSubscriber
services:
acme.serializer.subscriber:
class: %acme.serializer_subscriber.class%
tags:
- { name: jms_serializer.event_subscriber }
重建你的缓存,你应该很好!