D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
usr
/
local
/
psa
/
admin
/
plib
/
modules
/
rest-api
/
vendor
/
jms
/
serializer
/
src
/
Handler
/
Filename :
SymfonyUidHandler.php
back
Copy
<?php declare (strict_types=1); namespace PleskRestApi\JMS\Serializer\Handler; use PleskRestApi\JMS\Serializer\DeserializationContext; use PleskRestApi\JMS\Serializer\Exception\InvalidArgumentException; use PleskRestApi\JMS\Serializer\GraphNavigatorInterface; use PleskRestApi\JMS\Serializer\SerializationContext; use PleskRestApi\JMS\Serializer\Visitor\DeserializationVisitorInterface; use PleskRestApi\JMS\Serializer\Visitor\SerializationVisitorInterface; use PleskRestApi\JMS\Serializer\XmlSerializationVisitor; use PleskRestApi\Symfony\Component\Uid\AbstractUid; use PleskRestApi\Symfony\Component\Uid\Ulid; use PleskRestApi\Symfony\Component\Uid\Uuid; use PleskRestApi\Symfony\Component\Uid\UuidV1; use PleskRestApi\Symfony\Component\Uid\UuidV3; use PleskRestApi\Symfony\Component\Uid\UuidV4; use PleskRestApi\Symfony\Component\Uid\UuidV5; use PleskRestApi\Symfony\Component\Uid\UuidV6; use PleskRestApi\Symfony\Component\Uid\UuidV7; use PleskRestApi\Symfony\Component\Uid\UuidV8; final class SymfonyUidHandler implements SubscribingHandlerInterface { public const FORMAT_BASE32 = 'base32'; public const FORMAT_BASE58 = 'base58'; public const FORMAT_CANONICAL = 'canonical'; public const FORMAT_RFC4122 = 'rfc4122'; private const UID_CLASSES = [Ulid::class, Uuid::class, UuidV1::class, UuidV3::class, UuidV4::class, UuidV5::class, UuidV6::class, UuidV7::class, UuidV8::class]; /** * @var string * @phpstan-var self::FORMAT_* */ private $defaultFormat; /** * @var bool */ private $xmlCData; public function __construct(string $defaultFormat = self::FORMAT_CANONICAL, bool $xmlCData = \true) { $this->defaultFormat = $defaultFormat; $this->xmlCData = $xmlCData; } public static function getSubscribingMethods() : array { $methods = []; $formats = ['json', 'xml']; foreach ($formats as $format) { foreach (self::UID_CLASSES as $class) { $methods[] = ['direction' => GraphNavigatorInterface::DIRECTION_SERIALIZATION, 'format' => $format, 'type' => $class, 'method' => 'serializeUid']; $methods[] = ['direction' => GraphNavigatorInterface::DIRECTION_DESERIALIZATION, 'format' => $format, 'type' => $class, 'method' => 'deserializeUidFrom' . \ucfirst($format)]; } } return $methods; } /** * @phpstan-param array{name: class-string<AbstractUid>, params: array} $type */ public function deserializeUidFromJson(DeserializationVisitorInterface $visitor, ?string $data, array $type, DeserializationContext $context) : ?AbstractUid { if (null === $data) { return null; } return $this->deserializeUid($data, $type); } /** * @phpstan-param array{name: class-string<AbstractUid>, params: array} $type */ public function deserializeUidFromXml(DeserializationVisitorInterface $visitor, \SimpleXMLElement $data, array $type, DeserializationContext $context) : ?AbstractUid { if ($this->isDataXmlNull($data)) { return null; } return $this->deserializeUid((string) $data, $type); } /** * @phpstan-param array{name: class-string<AbstractUid>, params: array} $type */ private function deserializeUid(string $data, array $type) : ?AbstractUid { /** @var class-string<AbstractUid> $uidClass */ $uidClass = $type['name']; try { return $uidClass::fromString($data); } catch (\InvalidArgumentException|\TypeError $exception) { throw new InvalidArgumentException(\sprintf('"%s" is not a valid UID string.', $data), 0, $exception); } } /** * @return \DOMText|string * * @phpstan-param array{name: class-string<AbstractUid>, params: array} $type */ public function serializeUid(SerializationVisitorInterface $visitor, AbstractUid $uid, array $type, SerializationContext $context) { /** @phpstan-var self::FORMAT_* $format */ $format = $type['params'][0]['name'] ?? $this->defaultFormat; switch ($format) { case self::FORMAT_BASE32: $serialized = $uid->toBase32(); break; case self::FORMAT_BASE58: $serialized = $uid->toBase58(); break; case self::FORMAT_CANONICAL: $serialized = (string) $uid; break; case self::FORMAT_RFC4122: $serialized = $uid->toRfc4122(); break; default: throw new InvalidArgumentException(\sprintf('The "%s" format is not valid.', $format)); } if ($visitor instanceof XmlSerializationVisitor && \false === $this->xmlCData) { return $visitor->visitSimpleString($serialized, $type); } return $visitor->visitString($serialized, $type); } /** * @param mixed $data */ private function isDataXmlNull($data) : bool { $attributes = $data->attributes('xsi', \true); return isset($attributes['nil'][0]) && 'true' === (string) $attributes['nil'][0]; } }