annotate vendor/symfony/http-kernel/Controller/ArgumentResolver.php @ 19:fa3358dc1485 tip

Add ndrum files
author Chris Cannam
date Wed, 28 Aug 2019 13:14:47 +0100
parents 129ea1e6d783
children
rev   line source
Chris@0 1 <?php
Chris@0 2
Chris@0 3 /*
Chris@0 4 * This file is part of the Symfony package.
Chris@0 5 *
Chris@0 6 * (c) Fabien Potencier <fabien@symfony.com>
Chris@0 7 *
Chris@0 8 * For the full copyright and license information, please view the LICENSE
Chris@0 9 * file that was distributed with this source code.
Chris@0 10 */
Chris@0 11
Chris@0 12 namespace Symfony\Component\HttpKernel\Controller;
Chris@0 13
Chris@0 14 use Symfony\Component\HttpFoundation\Request;
Chris@0 15 use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
Chris@0 16 use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
Chris@0 17 use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver;
Chris@14 18 use Symfony\Component\HttpKernel\Controller\ArgumentResolver\SessionValueResolver;
Chris@0 19 use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver;
Chris@0 20 use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
Chris@0 21 use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactoryInterface;
Chris@0 22
Chris@0 23 /**
Chris@0 24 * Responsible for resolving the arguments passed to an action.
Chris@0 25 *
Chris@0 26 * @author Iltar van der Berg <kjarli@gmail.com>
Chris@0 27 */
Chris@0 28 final class ArgumentResolver implements ArgumentResolverInterface
Chris@0 29 {
Chris@0 30 private $argumentMetadataFactory;
Chris@0 31
Chris@0 32 /**
Chris@14 33 * @var iterable|ArgumentValueResolverInterface[]
Chris@0 34 */
Chris@0 35 private $argumentValueResolvers;
Chris@0 36
Chris@17 37 public function __construct(ArgumentMetadataFactoryInterface $argumentMetadataFactory = null, $argumentValueResolvers = [])
Chris@0 38 {
Chris@0 39 $this->argumentMetadataFactory = $argumentMetadataFactory ?: new ArgumentMetadataFactory();
Chris@0 40 $this->argumentValueResolvers = $argumentValueResolvers ?: self::getDefaultArgumentValueResolvers();
Chris@0 41 }
Chris@0 42
Chris@0 43 /**
Chris@0 44 * {@inheritdoc}
Chris@0 45 */
Chris@0 46 public function getArguments(Request $request, $controller)
Chris@0 47 {
Chris@17 48 $arguments = [];
Chris@0 49
Chris@0 50 foreach ($this->argumentMetadataFactory->createArgumentMetadata($controller) as $metadata) {
Chris@0 51 foreach ($this->argumentValueResolvers as $resolver) {
Chris@0 52 if (!$resolver->supports($request, $metadata)) {
Chris@0 53 continue;
Chris@0 54 }
Chris@0 55
Chris@0 56 $resolved = $resolver->resolve($request, $metadata);
Chris@0 57
Chris@0 58 if (!$resolved instanceof \Generator) {
Chris@17 59 throw new \InvalidArgumentException(sprintf('%s::resolve() must yield at least one value.', \get_class($resolver)));
Chris@0 60 }
Chris@0 61
Chris@0 62 foreach ($resolved as $append) {
Chris@0 63 $arguments[] = $append;
Chris@0 64 }
Chris@0 65
Chris@0 66 // continue to the next controller argument
Chris@0 67 continue 2;
Chris@0 68 }
Chris@0 69
Chris@0 70 $representative = $controller;
Chris@0 71
Chris@17 72 if (\is_array($representative)) {
Chris@17 73 $representative = sprintf('%s::%s()', \get_class($representative[0]), $representative[1]);
Chris@17 74 } elseif (\is_object($representative)) {
Chris@17 75 $representative = \get_class($representative);
Chris@0 76 }
Chris@0 77
Chris@0 78 throw new \RuntimeException(sprintf('Controller "%s" requires that you provide a value for the "$%s" argument. Either the argument is nullable and no null value has been provided, no default value has been provided or because there is a non optional argument after this one.', $representative, $metadata->getName()));
Chris@0 79 }
Chris@0 80
Chris@0 81 return $arguments;
Chris@0 82 }
Chris@0 83
Chris@0 84 public static function getDefaultArgumentValueResolvers()
Chris@0 85 {
Chris@17 86 return [
Chris@0 87 new RequestAttributeValueResolver(),
Chris@0 88 new RequestValueResolver(),
Chris@14 89 new SessionValueResolver(),
Chris@0 90 new DefaultValueResolver(),
Chris@0 91 new VariadicValueResolver(),
Chris@17 92 ];
Chris@0 93 }
Chris@0 94 }