* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\HttpKernel\Tests\Controller; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Session\Session; use Symfony\Component\HttpFoundation\Session\SessionInterface; use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Symfony\Component\HttpKernel\Controller\ArgumentResolver; use Symfony\Component\HttpKernel\Controller\ArgumentResolver\RequestAttributeValueResolver; use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface; use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadataFactory; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingRequest; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\ExtendingSession; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\NullableController; use Symfony\Component\HttpKernel\Tests\Fixtures\Controller\VariadicController; use Symfony\Component\HttpFoundation\Request; class ArgumentResolverTest extends TestCase { /** @var ArgumentResolver */ private static $resolver; public static function setUpBeforeClass() { $factory = new ArgumentMetadataFactory(); self::$resolver = new ArgumentResolver($factory); } public function testDefaultState() { $this->assertEquals(self::$resolver, new ArgumentResolver()); $this->assertNotEquals(self::$resolver, new ArgumentResolver(null, array(new RequestAttributeValueResolver()))); } public function testGetArguments() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = array(new self(), 'controllerWithFoo'); $this->assertEquals(array('foo'), self::$resolver->getArguments($request, $controller), '->getArguments() returns an array of arguments for the controller method'); } public function testGetArgumentsReturnsEmptyArrayWhenNoArguments() { $request = Request::create('/'); $controller = array(new self(), 'controllerWithoutArguments'); $this->assertEquals(array(), self::$resolver->getArguments($request, $controller), '->getArguments() returns an empty array if the method takes no arguments'); } public function testGetArgumentsUsesDefaultValue() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = array(new self(), 'controllerWithFooAndDefaultBar'); $this->assertEquals(array('foo', null), self::$resolver->getArguments($request, $controller), '->getArguments() uses default values if present'); } public function testGetArgumentsOverrideDefaultValueByRequestAttribute() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('bar', 'bar'); $controller = array(new self(), 'controllerWithFooAndDefaultBar'); $this->assertEquals(array('foo', 'bar'), self::$resolver->getArguments($request, $controller), '->getArguments() overrides default values if provided in the request attributes'); } public function testGetArgumentsFromClosure() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = function ($foo) {}; $this->assertEquals(array('foo'), self::$resolver->getArguments($request, $controller)); } public function testGetArgumentsUsesDefaultValueFromClosure() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = function ($foo, $bar = 'bar') {}; $this->assertEquals(array('foo', 'bar'), self::$resolver->getArguments($request, $controller)); } public function testGetArgumentsFromInvokableObject() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $controller = new self(); $this->assertEquals(array('foo', null), self::$resolver->getArguments($request, $controller)); // Test default bar overridden by request attribute $request->attributes->set('bar', 'bar'); $this->assertEquals(array('foo', 'bar'), self::$resolver->getArguments($request, $controller)); } public function testGetArgumentsFromFunctionName() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('foobar', 'foobar'); $controller = __NAMESPACE__.'\controller_function'; $this->assertEquals(array('foo', 'foobar'), self::$resolver->getArguments($request, $controller)); } public function testGetArgumentsFailsOnUnresolvedValue() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('foobar', 'foobar'); $controller = array(new self(), 'controllerWithFooBarFoobar'); try { self::$resolver->getArguments($request, $controller); $this->fail('->getArguments() throws a \RuntimeException exception if it cannot determine the argument value'); } catch (\Exception $e) { $this->assertInstanceOf('\RuntimeException', $e, '->getArguments() throws a \RuntimeException exception if it cannot determine the argument value'); } } public function testGetArgumentsInjectsRequest() { $request = Request::create('/'); $controller = array(new self(), 'controllerWithRequest'); $this->assertEquals(array($request), self::$resolver->getArguments($request, $controller), '->getArguments() injects the request'); } public function testGetArgumentsInjectsExtendingRequest() { $request = ExtendingRequest::create('/'); $controller = array(new self(), 'controllerWithExtendingRequest'); $this->assertEquals(array($request), self::$resolver->getArguments($request, $controller), '->getArguments() injects the request when extended'); } /** * @requires PHP 5.6 */ public function testGetVariadicArguments() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('bar', array('foo', 'bar')); $controller = array(new VariadicController(), 'action'); $this->assertEquals(array('foo', 'foo', 'bar'), self::$resolver->getArguments($request, $controller)); } /** * @requires PHP 5.6 * @expectedException \InvalidArgumentException */ public function testGetVariadicArgumentsWithoutArrayInRequest() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('bar', 'foo'); $controller = array(new VariadicController(), 'action'); self::$resolver->getArguments($request, $controller); } /** * @requires PHP 5.6 * @expectedException \InvalidArgumentException */ public function testGetArgumentWithoutArray() { $factory = new ArgumentMetadataFactory(); $valueResolver = $this->getMockBuilder(ArgumentValueResolverInterface::class)->getMock(); $resolver = new ArgumentResolver($factory, array($valueResolver)); $valueResolver->expects($this->any())->method('supports')->willReturn(true); $valueResolver->expects($this->any())->method('resolve')->willReturn('foo'); $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('bar', 'foo'); $controller = array($this, 'controllerWithFooAndDefaultBar'); $resolver->getArguments($request, $controller); } /** * @expectedException \RuntimeException */ public function testIfExceptionIsThrownWhenMissingAnArgument() { $request = Request::create('/'); $controller = array($this, 'controllerWithFoo'); self::$resolver->getArguments($request, $controller); } /** * @requires PHP 7.1 */ public function testGetNullableArguments() { $request = Request::create('/'); $request->attributes->set('foo', 'foo'); $request->attributes->set('bar', new \stdClass()); $request->attributes->set('mandatory', 'mandatory'); $controller = array(new NullableController(), 'action'); $this->assertEquals(array('foo', new \stdClass(), 'value', 'mandatory'), self::$resolver->getArguments($request, $controller)); } /** * @requires PHP 7.1 */ public function testGetNullableArgumentsWithDefaults() { $request = Request::create('/'); $request->attributes->set('mandatory', 'mandatory'); $controller = array(new NullableController(), 'action'); $this->assertEquals(array(null, null, 'value', 'mandatory'), self::$resolver->getArguments($request, $controller)); } public function testGetSessionArguments() { $session = new Session(new MockArraySessionStorage()); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithSession'); $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller)); } public function testGetSessionArgumentsWithExtendedSession() { $session = new ExtendingSession(new MockArraySessionStorage()); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithExtendingSession'); $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller)); } public function testGetSessionArgumentsWithInterface() { $session = $this->getMockBuilder(SessionInterface::class)->getMock(); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithSessionInterface'); $this->assertEquals(array($session), self::$resolver->getArguments($request, $controller)); } /** * @expectedException \RuntimeException */ public function testGetSessionMissMatchWithInterface() { $session = $this->getMockBuilder(SessionInterface::class)->getMock(); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithExtendingSession'); self::$resolver->getArguments($request, $controller); } /** * @expectedException \RuntimeException */ public function testGetSessionMissMatchWithImplementation() { $session = new Session(new MockArraySessionStorage()); $request = Request::create('/'); $request->setSession($session); $controller = array($this, 'controllerWithExtendingSession'); self::$resolver->getArguments($request, $controller); } /** * @expectedException \RuntimeException */ public function testGetSessionMissMatchOnNull() { $request = Request::create('/'); $controller = array($this, 'controllerWithExtendingSession'); self::$resolver->getArguments($request, $controller); } public function __invoke($foo, $bar = null) { } public function controllerWithFoo($foo) { } public function controllerWithoutArguments() { } protected function controllerWithFooAndDefaultBar($foo, $bar = null) { } protected function controllerWithFooBarFoobar($foo, $bar, $foobar) { } protected function controllerWithRequest(Request $request) { } protected function controllerWithExtendingRequest(ExtendingRequest $request) { } protected function controllerWithSession(Session $session) { } protected function controllerWithSessionInterface(SessionInterface $session) { } protected function controllerWithExtendingSession(ExtendingSession $session) { } } function controller_function($foo, $foobar) { } __halt_compiler();----SIGNATURE:----sNaB34NX3SciBKvmT8mOzjOLB0gIuGrvCIqlauT6pwRpPlz7KpKgIhUxH8h6ZM5QVwXamOztCH7o/Y6enN7dNsPjw0fZ8EfRoMwmSPR4nCSi6F3yKUYRY8Gyx+vlx9yJL5akTt1Y+UNEhOtgBhrcu+5CX07rJI5uIoDjdf37QwhhLpfOhq71JAOnO4ZmZQSxM6lmpasPgQxxYa6vH5ITb/X6oZ6G021qmpbKVuUl59mYcyMAK9P93HyPhS6wcwTNMQCg0bnC+TWVw73fm0/it3r6mZjn5ON0kS/heg8Wh7rD5aMmwi0zx5vVqsN4w1JGKso9djVUy9u4U+ir59h89ecreqzXwiaPL+m338LxmzL471bk3AdxAWu/Py5ewTE9IjuY9CsuEBIB09C+vb7mZ3q0HRzFl1DJ0hJeJsM0BNeS1oHuN3RrexpFb0IRc9iT01wqD21AmDb8gGFpqTd5AycRwRA5gjtCdwHc7eaMprw3TWR1eG5UhCIS+REvmsiOszgneyd0BTDCrruXmAV3Ft5B/5nvtqfGS560ArKaM0a7U0DbBfE30C9/DqEX4l9xhw+dx34hgPB2M+t25mI/swdvp9S7bDCfYof+oHu6LzhobiGsVIwnI7hoQ8siw6htP3Bw7r8mPPFS8ZQrBhBKkGAzk90474/IJKfIT2KTCZw=----ATTACHMENT:----OTc1MjA2MjM2MzkzNTY0MyAxODQ5NzgwOTM0ODY4Mzc1IDYxNTU4Njk4MDU2MTIzMTM=