Skip to content

Commit

Permalink
call setContainer() for autowired controllers
Browse files Browse the repository at this point in the history
  • Loading branch information
xabbuh committed Jul 3, 2017
1 parent 7093fc1 commit 1d07a28
Show file tree
Hide file tree
Showing 2 changed files with 82 additions and 1 deletion.
Expand Up @@ -49,7 +49,19 @@ protected function createController($controller)
$controller = $this->parser->parse($controller);
}

return parent::createController($controller);
$resolvedController = parent::createController($controller);

if (1 === substr_count($controller, ':') && is_array($resolvedController)) {
if ($resolvedController[0] instanceof ContainerAwareInterface) {
$resolvedController[0]->setContainer($this->container);
}

if ($resolvedController[0] instanceof AbstractController && null !== $previousContainer = $resolvedController[0]->setContainer($this->container)) {
$resolvedController[0]->setContainer($previousContainer);
}
}

return $resolvedController;
}

/**
Expand Down
Expand Up @@ -13,6 +13,7 @@

use Psr\Container\ContainerInterface as Psr11ContainerInterface;
use Psr\Log\LoggerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Bundle\FrameworkBundle\Controller\ControllerNameParser;
use Symfony\Bundle\FrameworkBundle\Controller\ControllerResolver;
use Symfony\Component\DependencyInjection\Container;
Expand Down Expand Up @@ -68,6 +69,24 @@ public function testGetControllerWithBundleNotation()
$this->assertSame('testAction', $controller[1]);
}

public function testContainerAwareControllerGetsContainerWhenNotSet()
{
class_exists(AbstractControllerTest::class);

$controller = new ContainerAwareController();

$container = new Container();
$container->set(TestAbstractController::class, $controller);

$resolver = $this->createControllerResolver(null, $container);

$request = Request::create('/');
$request->attributes->set('_controller', TestAbstractController::class.':testAction');

$this->assertSame(array($controller, 'testAction'), $resolver->getController($request));
$this->assertSame($container, $controller->getContainer());
}

public function testAbstractControllerGetsContainerWhenNotSet()
{
class_exists(AbstractControllerTest::class);
Expand All @@ -86,6 +105,24 @@ class_exists(AbstractControllerTest::class);
$this->assertSame($container, $controller->setContainer($container));
}

public function testAbstractControllerServiceWithFcqnIdGetsContainerWhenNotSet()
{
class_exists(AbstractControllerTest::class);

$controller = new DummyController();

$container = new Container();
$container->set(DummyController::class, $controller);

$resolver = $this->createControllerResolver(null, $container);

$request = Request::create('/');
$request->attributes->set('_controller', DummyController::class.':fooAction');

$this->assertSame(array($controller, 'fooAction'), $resolver->getController($request));
$this->assertSame($container, $controller->getContainer());
}

public function testAbstractControllerGetsNoContainerWhenSet()
{
class_exists(AbstractControllerTest::class);
Expand All @@ -106,6 +143,26 @@ class_exists(AbstractControllerTest::class);
$this->assertSame($controllerContainer, $controller->setContainer($container));
}

public function testAbstractControllerServiceWithFcqnIdGetsNoContainerWhenSet()
{
class_exists(AbstractControllerTest::class);

$controller = new DummyController();
$controllerContainer = new Container();
$controller->setContainer($controllerContainer);

$container = new Container();
$container->set(DummyController::class, $controller);

$resolver = $this->createControllerResolver(null, $container);

$request = Request::create('/');
$request->attributes->set('_controller', DummyController::class.':fooAction');

$this->assertSame(array($controller, 'fooAction'), $resolver->getController($request));
$this->assertSame($controllerContainer, $controller->getContainer());
}

protected function createControllerResolver(LoggerInterface $logger = null, Psr11ContainerInterface $container = null, ControllerNameParser $parser = null)
{
if (!$parser) {
Expand Down Expand Up @@ -152,3 +209,15 @@ public function __invoke()
{
}
}

class DummyController extends AbstractController
{
public function getContainer()
{
return $this->container;
}

public function fooAction()
{
}
}

0 comments on commit 1d07a28

Please sign in to comment.