Вход Регистрация
Файл: vendor/symfony/http-kernel/Controller/ArgumentResolver/DateTimeValueResolver.php
Строк: 139
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace SymfonyComponentHttpKernelControllerArgumentResolver;

use 
PsrClockClockInterface;
use 
SymfonyComponentHttpFoundationRequest;
use 
SymfonyComponentHttpKernelAttributeMapDateTime;
use 
SymfonyComponentHttpKernelControllerArgumentValueResolverInterface;
use 
SymfonyComponentHttpKernelControllerValueResolverInterface;
use 
SymfonyComponentHttpKernelControllerMetadataArgumentMetadata;
use 
SymfonyComponentHttpKernelExceptionNotFoundHttpException;

/**
 * Convert DateTime instances from request attribute variable.
 *
 * @author Benjamin Eberlei <kontakt@beberlei.de>
 * @author Tim Goudriaan <tim@codedmonkey.com>
 */
final class DateTimeValueResolver implements ArgumentValueResolverInterfaceValueResolverInterface
{
    public function 
__construct(
        private 
readonly ?ClockInterface $clock null,
    ) {
    }

    
/**
     * @deprecated since Symfony 6.2, use resolve() instead
     */
    
public function supports(Request $requestArgumentMetadata $argument): bool
    
{
        @
trigger_deprecation('symfony/http-kernel''6.2''The "%s()" method is deprecated, use "resolve()" instead.'__METHOD__);

        return 
is_a($argument->getType(), DateTimeInterface::class, true) && $request->attributes->has($argument->getName());
    }

    public function 
resolve(Request $requestArgumentMetadata $argument): array
    {
        if (!
is_a($argument->getType(), DateTimeInterface::class, true) || !$request->attributes->has($argument->getName())) {
            return [];
        }

        
$value $request->attributes->get($argument->getName());
        
$class DateTimeInterface::class === $argument->getType() ? DateTimeImmutable::class : $argument->getType();

        if (!
$value) {
            if (
$argument->isNullable()) {
                return [
null];
            }
            if (!
$this->clock) {
                return [new 
$class()];
            }
            
$value $this->clock->now();
        }

        if (
$value instanceof DateTimeInterface) {
            return [
$value instanceof $class $value $class::createFromInterface($value)];
        }

        
$format null;

        if (
$attributes $argument->getAttributes(MapDateTime::class, ArgumentMetadata::IS_INSTANCEOF)) {
            
$attribute $attributes[0];
            
$format $attribute->format;
        }

        if (
null !== $format) {
            
$date $class::createFromFormat($format$value$this->clock?->now()->getTimeZone());

            if ((
$class::getLastErrors() ?: ['warning_count' => 0])['warning_count']) {
                
$date false;
            }
        } else {
            if (
false !== filter_var($valueFILTER_VALIDATE_INT, ['options' => ['min_range' => 0]])) {
                
$value '@'.$value;
            }
            try {
                
$date = new $class($value$this->clock?->now()->getTimeZone());
            } catch (
Exception) {
                
$date false;
            }
        }

        if (!
$date) {
            throw new 
NotFoundHttpException(sprintf('Invalid date given for parameter "%s".'$argument->getName()));
        }

        return [
$date];
    }
}
Онлайн: 2
Реклама