Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 1bf80c9

Browse files
Iltar van der Berglinaori
Iltar van der Berg
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
namespace Symfony\Component\HttpKernel\Tests\Fixtures\Controller;
4+
5+
use Symfony\Component\HttpFoundation\Request;
6+
7+
class ExtendingRequest extends Request
8+
{
9+
}

src/Symfony/Component/HttpKernel/Tests/Fragment/InlineFragmentRendererTest.php

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,8 @@
1313

1414
use Symfony\Component\HttpFoundation\RequestStack;
1515
use Symfony\Component\HttpKernel\Controller\ArgumentResolver;
16-
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\ArgumentFromAttributeResolver;
17-
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\DefaultArgumentValueResolver;
18-
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\RequestResolver;
19-
use Symfony\Component\HttpKernel\Controller\ArgumentValueResolver\VariadicArgumentValueResolver;
2016
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
2117
use Symfony\Component\HttpKernel\Controller\ControllerReference;
22-
use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory;
2318
use Symfony\Component\HttpKernel\HttpKernel;
2419
use Symfony\Component\HttpKernel\Fragment\InlineFragmentRenderer;
2520
use Symfony\Component\HttpKernel\KernelEvents;
@@ -91,14 +86,8 @@ public function testRenderWithObjectsAsAttributesPassedAsObjectsInTheController(
9186
return new Response($object1->getBar());
9287
}))
9388
;
94-
$argumentValueResolvers = array(
95-
new ArgumentFromAttributeResolver(),
96-
new VariadicArgumentValueResolver(),
97-
new RequestResolver(),
98-
new DefaultArgumentValueResolver(),
99-
);
100-
101-
$kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack(), new ArgumentResolver(new ArgumentMetadataFactory(), $argumentValueResolvers));
89+
90+
$kernel = new HttpKernel(new EventDispatcher(), $resolver, new RequestStack(), new ArgumentResolver());
10291
$renderer = new InlineFragmentRenderer($kernel);
10392

10493
$response = $renderer->render(new ControllerReference('main_controller', array('object' => new \stdClass(), 'object1' => new Bar()), array()), Request::create('/'));

0 commit comments

Comments
 (0)