zored /
telegram
| 1 | <?php |
||
| 2 | |||
| 3 | declare(strict_types=1); |
||
| 4 | |||
| 5 | namespace Zored\Telegram\Serializer\Jms; |
||
| 6 | |||
| 7 | use JMS\Serializer\Naming\CamelCaseNamingStrategy; |
||
| 8 | use JMS\Serializer\SerializerBuilder; |
||
| 9 | use JMS\Serializer\SerializerInterface; |
||
| 10 | use Zored\Telegram\Serializer\Jms\Exception\JmsSerializerException; |
||
| 11 | use Zored\Telegram\Serializer\Jms\Visitor\ArrayDeserializationVisitor; |
||
| 12 | use Zored\Telegram\Serializer\Jms\Visitor\ArraySerializationVisitor; |
||
| 13 | use function is_object; |
||
| 14 | |||
| 15 | class JmsSerializer implements \Zored\Telegram\Serializer\SerializerInterface |
||
| 16 | { |
||
| 17 | public const FORMAT_ARRAY = 'array'; |
||
| 18 | |||
| 19 | /** |
||
| 20 | * @var SerializerInterface |
||
| 21 | */ |
||
| 22 | private $serializer; |
||
| 23 | |||
| 24 | /** |
||
| 25 | * @var string[] |
||
| 26 | */ |
||
| 27 | private $classMap; |
||
| 28 | |||
| 29 | /** |
||
| 30 | * @param string[] $classMap |
||
| 31 | * |
||
| 32 | * @throws JmsSerializerException |
||
| 33 | */ |
||
| 34 | public function __construct(SerializerInterface $serializer = null, array $classMap = []) |
||
| 35 | { |
||
| 36 | $this->serializer = $serializer ?? $this->createDefaultSerializer(); |
||
| 37 | $this->classMap = $classMap; |
||
| 38 | $this->assertClassMap(); |
||
| 39 | } |
||
| 40 | |||
| 41 | /** |
||
| 42 | * {@inheritdoc} |
||
| 43 | */ |
||
| 44 | public function deserialize(string $class, array $data) |
||
| 45 | { |
||
| 46 | $class = $this->classMap[$class] ?? $class; |
||
| 47 | $result = $this->serializer->deserialize($data, $class, self::FORMAT_ARRAY); |
||
|
0 ignored issues
–
show
Bug
introduced
by
Loading history...
|
|||
| 48 | if (!is_object($result)) { |
||
| 49 | throw JmsSerializerException::becauseNotObjectReturned($result); |
||
| 50 | } |
||
| 51 | |||
| 52 | return $result; |
||
| 53 | } |
||
| 54 | |||
| 55 | public function serialize($object): array |
||
| 56 | { |
||
| 57 | return (array) $this->serializer->serialize($object, self::FORMAT_ARRAY); |
||
| 58 | } |
||
| 59 | |||
| 60 | private function createDefaultSerializer(): SerializerInterface |
||
| 61 | { |
||
| 62 | $builder = SerializerBuilder::create(); |
||
| 63 | |||
| 64 | $builder->addDefaultDeserializationVisitors(); |
||
| 65 | $builder->addDefaultSerializationVisitors(); |
||
| 66 | $namingStrategy = new CamelCaseNamingStrategy(); |
||
| 67 | $builder->setDeserializationVisitor(self::FORMAT_ARRAY, new ArrayDeserializationVisitor($namingStrategy)); |
||
| 68 | $builder->setSerializationVisitor(self::FORMAT_ARRAY, new ArraySerializationVisitor($namingStrategy)); |
||
| 69 | |||
| 70 | return $builder->build(); |
||
| 71 | } |
||
| 72 | |||
| 73 | /** |
||
| 74 | * @throws JmsSerializerException |
||
| 75 | */ |
||
| 76 | private function assertClassMap(): void |
||
| 77 | { |
||
| 78 | foreach ($this->classMap as $before => $after) { |
||
| 79 | if (is_subclass_of($after, $before)) { |
||
| 80 | continue; |
||
| 81 | } |
||
| 82 | throw JmsSerializerException::becauseOfWrongMapping($before, $after); |
||
| 83 | } |
||
| 84 | } |
||
| 85 | } |
||
| 86 |