Пользовательский обработчик на JMSSerializerBundle игнорируется
Я пытаюсь использовать пользовательский обработчик для пакета сериализатора JMS
class CustomHandler implements SubscribingHandlerInterface
{
public static function getSubscribingMethods()
{
return array(
array(
'direction' => GraphNavigator::DIRECTION_SERIALIZATION,
'format' => 'json',
'type' => 'integer',
'method' => 'serializeIntToJson',
),
);
}
public function serializeIntToJson(JsonSerializationVisitor $visitor, $int, array $type, Context $context)
{
die("GIVE ME SOMETHING");
}
}
это ничего не делает и не умирает. Вот как я регистрирую обработчик
$serializer = SerializerBuilder::create()
->configureHandlers(function(HandlerRegistry $registry) {
$registry->registerSubscribingHandler(new MyHandler());
})
->addDefaultHandlers()
->build();
$json = $serializer->serialize($obj, 'json');
мой обработчик никогда не вызывается, и я не могу манипулировать сведения о сериализации.
2 ответов
нужно создать сервис для этого обработчика:
custom_jms_handler:
class: MyBundle\Serializer\CustomHandler
tags:
- { name: jms_serializer.subscribing_handler }
затем убедитесь, что вы используете зарегистрированный сервис сериализатора JMS
$json = $this->get('jms_serializer')->serialize($obj, 'json');
у меня это работает
$serializer = SerializerBuilder::create()
->configureListeners(function(EventDispatcher $dispatcher) {
$dispatcher->addSubscriber(new ProjectSubscriber($this->container));
$dispatcher->addSubscriber(new UserSubscriber($this->container));
})
->addDefaultListeners()
->addMetadataDir(realpath($this->get('kernel')->getRootDir()."/../") . '/src/Jake/NameOfBundle/Resources/config/serializer')
->build();
return $serializer->serialize($project, 'json');
$project
- Это моя сущность.
вы можете опустить эту строку, если у вас нет конфигураций сериализатора
->addMetadataDir(realpath($this->get('kernel')->getRootDir()."/../") . '/src/Jake/NameOfBundle/Resources/config/serializer')
Я думаю, что моей главной проблемой было это ->addDefaultListeners()
.
на config.yml
Я
jms_serializer:
metadata:
auto_detection: true
directories:
NameOfBundle:
namespace_prefix: ""
path: "@JakeNameOfBundle/Resources/config/serializer"
у меня нет ничего, чтобы сделать JMS сервисом.