Skip to content

Commit 1bf80c9

Browse files
Iltar van der Berglinaori
authored andcommitted
Improved DX for the ArgumentResolver
1 parent f29bf4c commit 1bf80c9

File tree

12 files changed

+106
-38
lines changed

12 files changed

+106
-38
lines changed

src/Symfony/Bundle/FrameworkBundle/Resources/config/web.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,19 @@
2424
<argument type="collection" />
2525
</service>
2626

27-
<service id="argument_value_resolver.argument_from_attribute" class="Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\ArgumentFromAttributeResolver" public="false">
27+
<service id="argument_resolver.request_attribute" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver" public="false">
2828
<tag name="controller_argument.value_resolver" priority="100" />
2929
</service>
3030

31-
<service id="argument_value_resolver.argument_is_request" class="Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\RequestResolver" public="false">
31+
<service id="argument_resolver.request" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver" public="false">
3232
<tag name="controller_argument.value_resolver" priority="50" />
3333
</service>
3434

35-
<service id="argument_value_resolver.default_argument_value" class="Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\DefaultArgumentValueResolver" public="false">
35+
<service id="argument_resolver.default" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver" public="false">
3636
<tag name="controller_argument.value_resolver" priority="-100" />
3737
</service>
3838

39-
<service id="argument_value_resolver.variadic_argument_from_attribute" class="Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\VariadicArgumentValueResolver" public="false">
39+
<service id="argument_resolver.variadic" class="Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver" public="false">
4040
<tag name="controller_argument.value_resolver" priority="-150" />
4141
</service>
4242

src/Symfony/Component/HttpKernel/Controller/ArgumentResolver.php

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@
1212
namespace Symfony\Component\HttpKernel\Controller;
1313

1414
use Symfony\Component\HttpFoundation\Request;
15+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
16+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
17+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver;
18+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver;
19+
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
1520
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactoryInterface;
1621

1722
/**
@@ -30,8 +35,13 @@ final class ArgumentResolver implements ArgumentResolverInterface
3035

3136
public function __construct(ArgumentMetadataFactoryInterface $argumentMetadataFactory = null, array $argumentValueResolvers = array())
3237
{
33-
$this->argumentMetadataFactory = $argumentMetadataFactory;
34-
$this->argumentValueResolvers = $argumentValueResolvers;
38+
$this->argumentMetadataFactory = $argumentMetadataFactory ?: new ArgumentMetadataFactory();
39+
$this->argumentValueResolvers = $argumentValueResolvers ?: array(
40+
new RequestAttributeValueResolver(),
41+
new RequestValueResolver(),
42+
new DefaultValueResolver(),
43+
new VariadicValueResolver(),
44+
);
3545
}
3646

3747
/**
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Component\HttpKernel\Controller\ArgumentValueResolver;
12+
namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;
1313

1414
use Symfony\Component\HttpFoundation\Request;
1515
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
@@ -20,7 +20,7 @@
2020
*
2121
* @author Iltar van der Berg <kjarli@gmail.com>
2222
*/
23-
final class DefaultArgumentValueResolver implements ArgumentValueResolverInterface
23+
final class DefaultValueResolver implements ArgumentValueResolverInterface
2424
{
2525
/**
2626
* {@inheritdoc}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Component\HttpKernel\Controller\ArgumentValueResolver;
12+
namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;
1313

1414
use Symfony\Component\HttpFoundation\Request;
1515
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
@@ -20,7 +20,7 @@
2020
*
2121
* @author Iltar van der Berg <kjarli@gmail.com>
2222
*/
23-
final class ArgumentFromAttributeResolver implements ArgumentValueResolverInterface
23+
final class RequestAttributeValueResolver implements ArgumentValueResolverInterface
2424
{
2525
/**
2626
* {@inheritdoc}

src/Symfony/Component/HttpKernel/Controller/ArgumentValueResolver/RequestResolver.php renamed to src/Symfony/Component/HttpKernel/Controller/ArgumentResolver/RequestValueResolver.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Component\HttpKernel\Controller\ArgumentValueResolver;
12+
namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;
1313

1414
use Symfony\Component\HttpFoundation\Request;
1515
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
@@ -20,14 +20,14 @@
2020
*
2121
* @author Iltar van der Berg <kjarli@gmail.com>
2222
*/
23-
final class RequestResolver implements ArgumentValueResolverInterface
23+
final class RequestValueResolver implements ArgumentValueResolverInterface
2424
{
2525
/**
2626
* {@inheritdoc}
2727
*/
2828
public function supports(Request $request, ArgumentMetadata $argument)
2929
{
30-
return $argument->getType() === Request::class || is_subclass_of(Request::class, $argument->getType());
30+
return $argument->getType() === Request::class || is_subclass_of($argument->getType(), Request::class);
3131
}
3232

3333
/**
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
* file that was distributed with this source code.
1010
*/
1111

12-
namespace Symfony\Component\HttpKernel\Controller\ArgumentValueResolver;
12+
namespace Symfony\Component\HttpKernel\Controller\ArgumentResolver;
1313

1414
use Symfony\Component\HttpFoundation\Request;
1515
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
@@ -20,7 +20,7 @@
2020
*
2121
* @author Iltar van der Berg <kjarli@gmail.com>
2222
*/
23-
final class VariadicArgumentValueResolver implements ArgumentValueResolverInterface
23+
final class VariadicValueResolver implements ArgumentValueResolverInterface
2424
{
2525
/**
2626
* {@inheritdoc}

src/Symfony/Component/HttpKernel/ControllerMetadata/ArgumentMetadata.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,12 +87,16 @@ public function hasDefaultValue()
8787
/**
8888
* Returns the default value of the argument.
8989
*
90-
* Make sure to call {@see self::hasDefaultValue()} first to see if a default value is possible.
90+
* @throws \LogicException if no default value is present; {@see self::hasDefaultValue()}
9191
*
9292
* @return mixed
9393
*/
9494
public function getDefaultValue()
9595
{
96+
if (!$this->hasDefaultValue) {
97+
throw new \LogicException(sprintf('Argument $%s does not have a default value. Use %s::hasDefaultValue() to avoid this exception.', $this->name, __CLASS__));
98+
}
99+
96100
return $this->defaultValue;
97101
}
98102
}

src/Symfony/Component/HttpKernel/HttpKernel.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
namespace Symfony\Component\HttpKernel;
1313

14+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
1415
use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
1516
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
1617
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
@@ -47,7 +48,7 @@ public function __construct(EventDispatcherInterface $dispatcher, ControllerReso
4748
$this->argumentResolver = $argumentResolver;
4849

4950
if (null === $this->argumentResolver) {
50-
@trigger_error(sprintf('As of 3.1 an %s is used to resolve arguments. In 4.0 the $argumentResolver becomes mandatory and the %s can no longer be used to resolve arguments.', ArgumentResolverInterface::class, ControllerResolverInterface::class), E_USER_DEPRECATED);
51+
@trigger_error(sprintf('As of 3.1 an %s is used to resolve arguments. In 4.0 the $argumentResolver becomes the %s if no other is provided instead of using the $resolver argument.', ArgumentResolverInterface::class, ArgumentResolver::class), E_USER_DEPRECATED);
5152
// fallback in case of deprecations
5253
$this->argumentResolver = $resolver;
5354
}

src/Symfony/Component/HttpKernel/Tests/Controller/ArgumentResolverTest.php

Lines changed: 27 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@
1212
namespace Symfony\Component\HttpKernel\Tests\Controller;
1313

1414
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
15-
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\ArgumentFromAttributeResolver;
16-
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\DefaultArgumentValueResolver;
17-
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\RequestResolver;
18-
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\VariadicArgumentValueResolver;
15+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\DefaultValueResolver;
16+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver;
17+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestValueResolver;
18+
use Symfony\Component\HttpKernel\Controller\ArgumentResolver\VariadicValueResolver;
1919
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
2020
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
21+
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingRequest;
2122
use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController;
2223
use Symfony\Component\HttpFoundation\Request;
2324

@@ -30,15 +31,21 @@ public static function setUpBeforeClass()
3031
{
3132
$factory = new ArgumentMetadataFactory();
3233
$argumentValueResolvers = array(
33-
new ArgumentFromAttributeResolver(),
34-
new VariadicArgumentValueResolver(),
35-
new RequestResolver(),
36-
new DefaultArgumentValueResolver(),
34+
new RequestAttributeValueResolver(),
35+
new RequestValueResolver(),
36+
new DefaultValueResolver(),
37+
new VariadicValueResolver(),
3738
);
3839

3940
self::$resolver = new ArgumentResolver($factory, $argumentValueResolvers);
4041
}
4142

43+
public function testDefaultState()
44+
{
45+
$this->assertEquals(self::$resolver, new ArgumentResolver());
46+
$this->assertNotEquals(self::$resolver, new ArgumentResolver(null, array(new RequestAttributeValueResolver())));
47+
}
48+
4249
public function testGetArguments()
4350
{
4451
$request = Request::create('/');
@@ -140,6 +147,14 @@ public function testGetArgumentsInjectsRequest()
140147
$this->assertEquals(array($request), self::$resolver->getArguments($request, $controller), '->getArguments() injects the request');
141148
}
142149

150+
public function testGetArgumentsInjectsExtendingRequest()
151+
{
152+
$request = ExtendingRequest::create('/');
153+
$controller = array(new self(), 'controllerWithExtendingRequest');
154+
155+
$this->assertEquals(array($request), self::$resolver->getArguments($request, $controller), '->getArguments() injects the request when extended');
156+
}
157+
143158
/**
144159
* @requires PHP 5.6
145160
*/
@@ -210,6 +225,10 @@ protected function controllerWithFooBarFoobar($foo, $bar, $foobar)
210225
protected function controllerWithRequest(Request $request)
211226
{
212227
}
228+
229+
protected function controllerWithExtendingRequest(ExtendingRequest $request)
230+
{
231+
}
213232
}
214233

215234
function controller_function($foo, $foobar)
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
/*
4+
* This file is part of the Symfony package.
5+
*
6+
* (c) Fabien Potencier <fabien@symfony.com>
7+
*
8+
* For the full copyright and license information, please view the LICENSE
9+
* file that was distributed with this source code.
10+
*/
11+
12+
namespace Symfony\Component\HttpKernel\Tests\ControllerMetadata;
13+
14+
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
15+
16+
class ArgumentMetadataTest extends \PHPUnit_Framework_TestCase
17+
{
18+
public function testDefaultValueAvailable()
19+
{
20+
$argument = new ArgumentMetadata('foo', 'string', false, true, 'default value');
21+
22+
$this->assertTrue($argument->hasDefaultValue());
23+
$this->assertSame('default value', $argument->getDefaultValue());
24+
}
25+
26+
/**
27+
* @expectedException \LogicException
28+
*/
29+
public function testDefaultValueUnavailable()
30+
{
31+
$argument = new ArgumentMetadata('foo', 'string', false, false, null);
32+
33+
$this->assertFalse($argument->hasDefaultValue());
34+
$argument->getDefaultValue();
35+
}
36+
}

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy