我确信这是一个小错误,但我找不到它。 我正在尝试关注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');
没有显示?
答案 0 :(得分:4)
我终于找到了问题。问题是
$serializer = SerializerBuilder::create()->build();
这不起作用,但确实如此:
$serializer = $this->get('jms_serializer');
答案 1 :(得分:0)
尝试添加class属性,例如:
public static function getSubscribedEvents()
{
return array(
array(
'event' => 'serializer.pre_serialize',
'class' => 'FQCN_class_name',
'method' => 'onPreSerialize',
)
);
}
关于doc的另一个不同之处在于类方法的参数:你应该使用PreSerializeEvent
而不是ObjectEvent
:
所以这样:
public function onPreSerialize(PreSerializeEvent $event)
{
// ...
}
使用控制台命令检查您的服务是否已从容器正确加载:
php app/console debug:container --tag=jms_serializer.event_subscriber
希望这个帮助