* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Serializer\Normalizer; use Symfony\Component\Serializer\Exception\InvalidArgumentException; use Symfony\Component\Serializer\Exception\UnexpectedValueException; /** * Normalizes an instance of {@see \DateInterval} to an interval string. * Denormalizes an interval string to an instance of {@see \DateInterval}. * * @author Jérôme Parmentier */ class DateIntervalNormalizer implements NormalizerInterface, DenormalizerInterface { const FORMAT_KEY = 'dateinterval_format'; private $format; /** * @param string $format */ public function __construct($format = 'P%yY%mM%dDT%hH%iM%sS') { $this->format = $format; } /** * {@inheritdoc} * * @throws InvalidArgumentException */ public function normalize($object, $format = null, array $context = array()) { if (!$object instanceof \DateInterval) { throw new InvalidArgumentException('The object must be an instance of "\DateInterval".'); } $dateIntervalFormat = isset($context[self::FORMAT_KEY]) ? $context[self::FORMAT_KEY] : $this->format; return $object->format($dateIntervalFormat); } /** * {@inheritdoc} */ public function supportsNormalization($data, $format = null) { return $data instanceof \DateInterval; } /** * {@inheritdoc} * * @throws InvalidArgumentException * @throws UnexpectedValueException */ public function denormalize($data, $class, $format = null, array $context = array()) { if (!is_string($data)) { throw new InvalidArgumentException(sprintf('Data expected to be a string, %s given.', gettype($data))); } if (!$this->isISO8601($data)) { throw new UnexpectedValueException('Expected a valid ISO 8601 interval string.'); } $dateIntervalFormat = isset($context[self::FORMAT_KEY]) ? $context[self::FORMAT_KEY] : $this->format; $valuePattern = '/^'.preg_replace('/%([yYmMdDhHiIsSwW])(\w)/', '(?P<$1>\d+)$2', $dateIntervalFormat).'$/'; if (!preg_match($valuePattern, $data)) { throw new UnexpectedValueException(sprintf('Value "%s" contains intervals not accepted by format "%s".', $data, $dateIntervalFormat)); } try { return new \DateInterval($data); } catch (\Exception $e) { throw new UnexpectedValueException($e->getMessage(), $e->getCode(), $e); } } /** * {@inheritdoc} */ public function supportsDenormalization($data, $type, $format = null) { return \DateInterval::class === $type; } private function isISO8601($string) { return preg_match('/^P(?=\w*(?:\d|%\w))(?:\d+Y|%[yY]Y)?(?:\d+M|%[mM]M)?(?:(?:\d+D|%[dD]D)|(?:\d+W|%[wW]W))?(?:T(?:\d+H|[hH]H)?(?:\d+M|[iI]M)?(?:\d+S|[sS]S)?)?$/', $string); } } __halt_compiler();----SIGNATURE:----aaVGl6RLKGFkhF0Er2597u1TecX1GmCxfe4JezWOK6yiN1PgXVwS6tVh07pQtRSEtxU9sX+UdFcqsXNIKYfc82jTvt/YD/Tcf9c38hSKv7WgehgVmrzAUF/bEvbjPlQ+dXsJQvKg0/VAKWyC5vMGRYeoPFKMe+Sn8BHfXqcR0N3FAXD5JF9TNjI7ihhK6v7nOwonEfQ30hFbb5eVKOLLUX9iEgagiMFbMQIo5RQfkcoPvcrbTOV2GVh7YLNWN7fSyZ4TrU25DI1oWBEx7cneoOmUDYKYFbEkCACYIAz6ZpKwvPTwOnCuhG902OI23N4bcQqJkMY6M+4UCbE7hxPAR9b3oz/RJ9CgGV6xll7KRz5tw++wQ8k2RjhzwG7RapmrdoOrWrtci9Jyu9SXXtQotHsUpCGymrHmv1wqHKhFqqgrLFtnF+UAvFsEfcNelldRbpc8PfsOWJDeLiKt4zVIX2AEq8TqpZ7PpCZS1u03Og/gbdWpw/XMWR+WJJBxqIFZ56V6GCvvPA4bdGRYudXH71gtmEe/eQkRmBE+Yf0DErD8k2V3ZYDkHWUUSTV415lCPKtP1baQ4/NO4jxfbBD0ZxTx6Z0LImXEHapCmFpWf4AScmpN24a0a+ScxZcU6cmw5OOzCxKYc1CoHEOcWFhwu00Z+8jMW9vBEI9sdzm4FRo=----ATTACHMENT:----NDUwNTg0NzM3Mjc0MDgxMSA5NTQ4NDQ1NDM4NzE4NTc1IDMyNDg3MzkwNjM3NzQ5MzY=