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

Skip to content

Commit 1d07a28

Browse files
committed
call setContainer() for autowired controllers
1 parent 7093fc1 commit 1d07a28

File tree

2 files changed

+82
-1
lines changed

2 files changed

+82
-1
lines changed

src/Symfony/Bundle/FrameworkBundle/Controller/ControllerResolver.php

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,19 @@ protected function createController($controller)
4949
$controller = $this->parser->parse($controller);
5050
}
5151

52-
return parent::createController($controller);
52+
$resolvedController = parent::createController($controller);
53+
54+
if (1 === substr_count($controller, ':') && is_array($resolvedController)) {
55+
if ($resolvedController[0] instanceof ContainerAwareInterface) {
56+
$resolvedController[0]->setContainer($this->container);
57+
}
58+
59+
if ($resolvedController[0] instanceof AbstractController && null !== $previousContainer = $resolvedController[0]->setContainer($this->container)) {
60+
$resolvedController[0]->setContainer($previousContainer);
61+
}
62+
}
63+
64+
return $resolvedController;
5365
}
5466

5567
/**

src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerResolverTest.php

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313

1414
use Psr\Container\ContainerInterface as Psr11ContainerInterface;
1515
use Psr\Log\LoggerInterface;
16+
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
1617
use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
1718
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
1819
use Symfony\Component\DependencyInjection\Container;
@@ -68,6 +69,24 @@ public function testGetControllerWithBundleNotation()
6869
$this->assertSame('testAction', $controller[1]);
6970
}
7071

72+
public function testContainerAwareControllerGetsContainerWhenNotSet()
73+
{
74+
class_exists(AbstractControllerTest::class);
75+
76+
$controller = new ContainerAwareController();
77+
78+
$container = new Container();
79+
$container->set(TestAbstractController::class, $controller);
80+
81+
$resolver = $this->createControllerResolver(null, $container);
82+
83+
$request = Request::create('/');
84+
$request->attributes->set('_controller', TestAbstractController::class.':testAction');
85+
86+
$this->assertSame(array($controller, 'testAction'), $resolver->getController($request));
87+
$this->assertSame($container, $controller->getContainer());
88+
}
89+
7190
public function testAbstractControllerGetsContainerWhenNotSet()
7291
{
7392
class_exists(AbstractControllerTest::class);
@@ -86,6 +105,24 @@ class_exists(AbstractControllerTest::class);
86105
$this->assertSame($container, $controller->setContainer($container));
87106
}
88107

108+
public function testAbstractControllerServiceWithFcqnIdGetsContainerWhenNotSet()
109+
{
110+
class_exists(AbstractControllerTest::class);
111+
112+
$controller = new DummyController();
113+
114+
$container = new Container();
115+
$container->set(DummyController::class, $controller);
116+
117+
$resolver = $this->createControllerResolver(null, $container);
118+
119+
$request = Request::create('/');
120+
$request->attributes->set('_controller', DummyController::class.':fooAction');
121+
122+
$this->assertSame(array($controller, 'fooAction'), $resolver->getController($request));
123+
$this->assertSame($container, $controller->getContainer());
124+
}
125+
89126
public function testAbstractControllerGetsNoContainerWhenSet()
90127
{
91128
class_exists(AbstractControllerTest::class);
@@ -106,6 +143,26 @@ class_exists(AbstractControllerTest::class);
106143
$this->assertSame($controllerContainer, $controller->setContainer($container));
107144
}
108145

146+
public function testAbstractControllerServiceWithFcqnIdGetsNoContainerWhenSet()
147+
{
148+
class_exists(AbstractControllerTest::class);
149+
150+
$controller = new DummyController();
151+
$controllerContainer = new Container();
152+
$controller->setContainer($controllerContainer);
153+
154+
$container = new Container();
155+
$container->set(DummyController::class, $controller);
156+
157+
$resolver = $this->createControllerResolver(null, $container);
158+
159+
$request = Request::create('/');
160+
$request->attributes->set('_controller', DummyController::class.':fooAction');
161+
162+
$this->assertSame(array($controller, 'fooAction'), $resolver->getController($request));
163+
$this->assertSame($controllerContainer, $controller->getContainer());
164+
}
165+
109166
protected function createControllerResolver(LoggerInterface $logger = null, Psr11ContainerInterface $container = null, ControllerNameParser $parser = null)
110167
{
111168
if (!$parser) {
@@ -152,3 +209,15 @@ public function __invoke()
152209
{
153210
}
154211
}
212+
213+
class DummyController extends AbstractController
214+
{
215+
public function getContainer()
216+
{
217+
return $this->container;
218+
}
219+
220+
public function fooAction()
221+
{
222+
}
223+
}

0 commit comments

Comments
 (0)