* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter; use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; /** * Convert DateTime instances from request attribute variable. * * @author Benjamin Eberlei */ class DateTimeParamConverter implements ParamConverterInterface { /** * {@inheritdoc} * * @throws NotFoundHttpException When invalid date given */ public function apply(Request $request, ParamConverter $configuration) { $param = $configuration->getName(); if (!$request->attributes->has($param)) { return false; } $options = $configuration->getOptions(); $value = $request->attributes->get($param); if (!$value && $configuration->isOptional()) { $request->attributes->set($param, null); return true; } $class = $configuration->getClass(); if (isset($options['format'])) { $date = $class::createFromFormat($options['format'], $value); if (0 < \DateTime::getLastErrors()['warning_count']) { $date = false; } if (!$date) { throw new NotFoundHttpException(sprintf('Invalid date given for parameter "%s".', $param)); } } else { $valueIsInt = filter_var($value, FILTER_VALIDATE_INT, ['options' => ['min_range' => 0]]); if (false !== $valueIsInt) { $date = (new $class())->setTimestamp($value); } else { if (false === strtotime($value)) { throw new NotFoundHttpException(sprintf('Invalid date given for parameter "%s".', $param)); } $date = new $class($value); } } $request->attributes->set($param, $date); return true; } /** * {@inheritdoc} */ public function supports(ParamConverter $configuration) { if (null === $configuration->getClass()) { return false; } return is_subclass_of($configuration->getClass(), \DateTimeInterface::class); } }