8000 bug #24305 [HttpKernel] Make array vs "::" controller definitions con… · symfony/symfony@3cb507b · GitHub
[go: up one dir, main page]

Skip to content

Commit 3cb507b

Browse 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

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

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

Lines 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

Lines 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