Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 3cb507b

Browse filesBrowse files
committed
bug #24305 [HttpKernel] Make array vs "::" controller definitions consistent (nicolas-grekas)
This PR was merged into the 3.3 branch. Discussion ---------- [HttpKernel] Make array vs "::" controller definitions consistent | Q | A | ------------- | --- | Branch? | 3.3 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | - | License | MIT | Doc PR | - Defining a controller using `[Foo::class, 'someAction']` vs `App\Controller\Foo::someAction` should end up produce the same result: a container lookup. Commits ------- f0f9a66 [HttpKernel] Make array vs "::" controller definitions consistent
2 parents 1ebc31a + f0f9a66 commit 3cb507b
Copy full SHA for 3cb507b

File tree

2 files changed

+65
-0
lines changed
Filter options

2 files changed

+65
-0
lines changed

‎src/Symfony/Component/HttpKernel/Controller/ContainerControllerResolver.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Controller/ContainerControllerResolver.php
+15Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Psr\Container\ContainerInterface;
1515
use Psr\Log\LoggerInterface;
16+
use Symfony\Component\HttpFoundation\Request;
1617

1718
/**
1819
* A controller resolver searching for a controller in a psr-11 container when using the "service:method" notation.
@@ -31,6 +32,20 @@ public function __construct(ContainerInterface $container, LoggerInterface $logg
3132
parent::__construct($logger);
3233
}
3334

35+
/**
36+
* {@inheritdoc}
37+
*/
38+
public function getController(Request $request)
39+
{
40+
$controller = parent::getController($request);
41+
42+
if (is_array($controller) && isset($controller[0]) && is_string($controller[0]) && $this->container->has($controller[0])) {
43+
$controller[0] = $this->instantiateController($controller[0]);
44+
}
45+
46+
return $controller;
47+
}
48+
3449
/**
3550
* Returns a callable for the given controller.
3651
*

‎src/Symfony/Component/HttpKernel/Tests/Controller/ContainerControllerResolverTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/HttpKernel/Tests/Controller/ContainerControllerResolverTest.php
+50Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,49 @@ public function testGetControllerInvokableServiceWithClassNameAsName()
8888
$this->assertEquals($invokableController, $controller);
8989
}
9090

91+
public function testNonInstantiableController()
92+
{
93+
$container = $this->createMockContainer();
94+
$container->expects($this->once())
95+
->method('has')
96+
->with(NonInstantiableController::class)
97+
->will($this->returnValue(false))
98+
;
99+
100+
$resolver = $this->createControllerResolver(null, $container);
101+
$request = Request::create('/');
102+
$request->attributes->set('_controller', array(NonInstantiableController::class, 'action'));
103+
104+
$controller = $resolver->getController($request);
105+
106+
$this->assertSame(array(NonInstantiableController::class, 'action'), $controller);
107+
}
108+
109+
public function testNonInstantiableControllerWithCorrespondingService()
110+
{
111+
$service = new \stdClass();
112+
113+
$container = $this->createMockContainer();
114+
$container->expects($this->atLeastOnce())
115+
->method('has')
116+
->with(NonInstantiableController::class)
117+
->will($this->returnValue(true))
118+
;
119+
$container->expects($this->atLeastOnce())
120+
->method('get')
121+
->with(NonInstantiableController::class)
122+
->will($this->returnValue($service))
123+
;
124+
125+
$resolver = $this->createControllerResolver(null, $container);
126+
$request = Request::create('/');
127+
$request->attributes->set('_controller', array(NonInstantiableController::class, 'action'));
128+
129+
$controller = $resolver->getController($request);
130+
131+
$this->assertSame(array($service, 'action'), $controller);
132+
}
133+
91134
/**
92135
* @dataProvider getUndefinedControllers
93136
*/
@@ -146,3 +189,10 @@ public function __invoke()
146189
{
147190
}
148191
}
192+
193+
abstract class NonInstantiableController
194+
{
195+
public static function action()
196+
{
197+
}
198+
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.