JMS 序列化程序事件不工作
JMS Serializer event is not working
我确定这是一个小错误,但我找不到它。
我正在尝试关注 the official doc 并在 pre_serialize 事件上实施事件侦听器。
我的服务声明:
<service id="app.question_serializer_subscriber" class="AppBundle\Serializer\QuestionSerializerSubscriber">
<tag name="jms_serializer.event_subscriber"/>
</service>
我的订阅者:
<?php
namespace AppBundle\Serializer;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;
class QuestionSerializerSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
array(
'event' => 'serializer.pre_serialize',
'method' => 'onPreSerialize',
)
);
}
public function onPreSerialize(ObjectEvent $event)
{
die('in event');
}
}
我的控制器:
$question = $repo->findLastVersionByQuestionId((int) $questionId);
$serializer = SerializerBuilder::create()->build();
$context = new SerializationContext();
return new JsonResponse(json_decode(
$serializer->serialize(
$question,
'json',
$context
),
true
));
当我访问路由时,我的实体问题被序列化并显示,但为什么 die('in event');
没有显示?
尝试添加 class 属性,例如:
public static function getSubscribedEvents()
{
return array(
array(
'event' => 'serializer.pre_serialize',
'class' => 'FQCN_class_name',
'method' => 'onPreSerialize',
)
);
}
关于文档的另一个区别在于 class 方法的参数:您应该使用 PreSerializeEvent
而不是 ObjectEvent
:
像这样:
public function onPreSerialize(PreSerializeEvent $event)
{
// ...
}
检查您的服务是否从容器中正确加载,例如使用控制台命令:
php app/console debug:container --tag=jms_serializer.event_subscriber
希望对您有所帮助
我终于找到问题了。问题是
$serializer = SerializerBuilder::create()->build();
这不起作用,但它确实有效:
$serializer = $this->get('jms_serializer');
我确定这是一个小错误,但我找不到它。 我正在尝试关注 the official doc 并在 pre_serialize 事件上实施事件侦听器。
我的服务声明:
<service id="app.question_serializer_subscriber" class="AppBundle\Serializer\QuestionSerializerSubscriber">
<tag name="jms_serializer.event_subscriber"/>
</service>
我的订阅者:
<?php
namespace AppBundle\Serializer;
use JMS\Serializer\EventDispatcher\EventSubscriberInterface;
use JMS\Serializer\EventDispatcher\ObjectEvent;
class QuestionSerializerSubscriber implements EventSubscriberInterface
{
public static function getSubscribedEvents()
{
return array(
array(
'event' => 'serializer.pre_serialize',
'method' => 'onPreSerialize',
)
);
}
public function onPreSerialize(ObjectEvent $event)
{
die('in event');
}
}
我的控制器:
$question = $repo->findLastVersionByQuestionId((int) $questionId);
$serializer = SerializerBuilder::create()->build();
$context = new SerializationContext();
return new JsonResponse(json_decode(
$serializer->serialize(
$question,
'json',
$context
),
true
));
当我访问路由时,我的实体问题被序列化并显示,但为什么 die('in event');
没有显示?
尝试添加 class 属性,例如:
public static function getSubscribedEvents()
{
return array(
array(
'event' => 'serializer.pre_serialize',
'class' => 'FQCN_class_name',
'method' => 'onPreSerialize',
)
);
}
关于文档的另一个区别在于 class 方法的参数:您应该使用 PreSerializeEvent
而不是 ObjectEvent
:
像这样:
public function onPreSerialize(PreSerializeEvent $event)
{
// ...
}
检查您的服务是否从容器中正确加载,例如使用控制台命令:
php app/console debug:container --tag=jms_serializer.event_subscriber
希望对您有所帮助
我终于找到问题了。问题是
$serializer = SerializerBuilder::create()->build();
这不起作用,但它确实有效:
$serializer = $this->get('jms_serializer');