scalar_or<My\Type>
class MyDto
{
/**
* @JMS\Type("scalar_or_object<App\Dto\SomeObject>")
*/
public bool|SomeObject $value;
}
A custom JMS type handler for bool|SomeObject union.
namespace App\Serializer\Handler;
use JMS\Serializer\Context;
use JMS\Serializer\GraphNavigatorInterface;
use JMS\Serializer\Handler\SubscribingHandlerInterface;
use JMS\Serializer\JsonDeserializationVisitor;
use JMS\Serializer\JsonSerializationVisitor;
use JMS\Serializer\VisitorInterface;
use JMS\Serializer\DeserializationContext;
use JMS\Serializer\SerializationContext;
final class BoolOrObjectHandler implements SubscribingHandlerInterface
{
public static function getSubscribingMethods(): array
{
return [
[
'type' => 'bool_or_object<App\\Dto\\SomeObject>',
'format' => 'json',
'direction' => GraphNavigatorInterface::DIRECTION_DESERIALIZATION,
'method' => 'deserialize',
],
[
'type' => 'bool_or_object<App\\Dto\\SomeObject>',
'format' => 'json',
'direction' => GraphNavigatorInterface::DIRECTION_SERIALIZATION,
'method' => 'serialize',
],
];
}
public function deserialize(
JsonDeserializationVisitor $visitor,
$data,
array $type,
DeserializationContext $context
) {
if (is_bool($data)) {
return $data;
}
return $context->getNavigator()->accept($data, [
'name' => 'App\\Dto\\SomeObject'
], $context);
}
public function serialize(
JsonSerializationVisitor $visitor,
$data,
array $type,
SerializationContext $context
) {
if (is_bool($data)) {
return $data;
}
return $context->getNavigator()->accept($data, [
'name' => 'App\\Dto\\SomeObject'
], $context);
}
}use App\Serializer\Handler\BoolOrObjectHandler;
use JMS\Serializer\SerializerBuilder;
$serializer = SerializerBuilder::create()
->configureHandlers(function($handlerRegistry) {
$handlerRegistry->registerSubscribingHandler(new BoolOrObjectHandler());
})
->build();use JMS\Serializer\Annotation as JMS;
class MyDto
{
/**
* @JMS\Type("bool_or_object<App\Dto\SomeObject>")
*/
public bool|SomeObject $value;
}