diff --git a/src/Controller/Doctrine/ControllerDoctrineTrait.php b/src/Controller/Doctrine/ControllerDoctrineTrait.php index 41d84f3..83a61c5 100644 --- a/src/Controller/Doctrine/ControllerDoctrineTrait.php +++ b/src/Controller/Doctrine/ControllerDoctrineTrait.php @@ -16,14 +16,14 @@ trait ControllerDoctrineTrait /** * @var ManagerRegistry */ - protected $doctrine; + private $doctrine; public function setDoctrine(ManagerRegistry $doctrine) { $this->doctrine = $doctrine; } - public function getDoctrine() : ManagerRegistry + protected function getDoctrine() : ManagerRegistry { return $this->doctrine; } diff --git a/src/DependencyInjection/Compiler/AutowireControllerDependencies.php b/src/DependencyInjection/Compiler/AutowireControllerDependenciesPass.php similarity index 87% rename from src/DependencyInjection/Compiler/AutowireControllerDependencies.php rename to src/DependencyInjection/Compiler/AutowireControllerDependenciesPass.php index 3540fb3..18827aa 100644 --- a/src/DependencyInjection/Compiler/AutowireControllerDependencies.php +++ b/src/DependencyInjection/Compiler/AutowireControllerDependenciesPass.php @@ -14,6 +14,7 @@ use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Reference; use Symplify\ControllerAutowire\Contract\DependencyInjection\ControllerClassMapInterface; +use Symplify\ControllerAutowire\Controller\ControllerTrait; use Symplify\ControllerAutowire\Controller\Doctrine\ControllerDoctrineTrait; use Symplify\ControllerAutowire\Controller\Form\ControllerFormTrait; use Symplify\ControllerAutowire\Controller\HttpKernel\ControllerHttpKernelTrait; @@ -23,7 +24,7 @@ use Symplify\ControllerAutowire\Controller\Session\ControllerFlashTrait; use Symplify\ControllerAutowire\Controller\Templating\ControllerRenderTrait; -final class AutowireControllerDependencies implements CompilerPassInterface +final class AutowireControllerDependenciesPass implements CompilerPassInterface { /** * @var ControllerClassMapInterface @@ -89,7 +90,7 @@ private function autowireControllerTraits(Definition $controllerDefinition) $usedTraits = class_uses($controllerDefinition->getClass()); foreach ($this->traitsToSettersToServiceNameList as $traitClass => $setterToServiceNames) { - if (! array_key_exists($traitClass, $usedTraits)) { + if (! $this->isTraitIncluded($traitClass, $usedTraits)) { continue; } @@ -102,4 +103,17 @@ private function autowireControllerTraits(Definition $controllerDefinition) } } } + + private function isTraitIncluded(string $traitClass, array $usedTraits) : bool + { + if (array_key_exists($traitClass, $usedTraits)) { + return true; + } + + if (isset($usedTraits[ControllerTrait::class])) { + return true; + } + + return false; + } } diff --git a/src/HttpKernel/Controller/ControllerResolver.php b/src/HttpKernel/Controller/ControllerResolver.php index c41b0b7..9d08e82 100644 --- a/src/HttpKernel/Controller/ControllerResolver.php +++ b/src/HttpKernel/Controller/ControllerResolver.php @@ -62,6 +62,7 @@ public function getController(Request $request) } list($class, $method) = $this->splitControllerClassAndMethod($controllerName); + if (! isset($this->controllerClassMap[$class])) { return $this->controllerResolver->getController($request); } diff --git a/src/SymplifyControllerAutowireBundle.php b/src/SymplifyControllerAutowireBundle.php index 2b196a4..37a62e7 100644 --- a/src/SymplifyControllerAutowireBundle.php +++ b/src/SymplifyControllerAutowireBundle.php @@ -11,7 +11,7 @@ use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Bundle\Bundle; -use Symplify\ControllerAutowire\DependencyInjection\Compiler\AutowireControllerDependencies; +use Symplify\ControllerAutowire\DependencyInjection\Compiler\AutowireControllerDependenciesPass; use Symplify\ControllerAutowire\DependencyInjection\Compiler\DecorateControllerResolverPass; use Symplify\ControllerAutowire\DependencyInjection\Compiler\RegisterControllersPass; use Symplify\ControllerAutowire\DependencyInjection\ControllerClassMap; @@ -30,7 +30,7 @@ public function build(ContainerBuilder $container) $controllerClassMap = new ControllerClassMap(); $container->addCompilerPass(new RegisterControllersPass($controllerClassMap, new ControllerFinder())); - $container->addCompilerPass(new AutowireControllerDependencies($controllerClassMap)); + $container->addCompilerPass(new AutowireControllerDependenciesPass($controllerClassMap)); $container->addCompilerPass(new DecorateControllerResolverPass($controllerClassMap)); } diff --git a/tests/CompleteTest.php b/tests/CompleteTest.php index 35206bf..58d833b 100644 --- a/tests/CompleteTest.php +++ b/tests/CompleteTest.php @@ -5,12 +5,16 @@ namespace Symplify\ControllerAutowire\Tests; use PHPUnit\Framework\TestCase; +use PHPUnit_Framework_Assert; use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpKernel\HttpKernelInterface; +use Symplify\ControllerAutowire\Controller\ControllerTrait; use Symplify\ControllerAutowire\HttpKernel\Controller\ControllerResolver; use Symplify\ControllerAutowire\Tests\CompleteTestSource\Controller\ControllerWithParameter; use Symplify\ControllerAutowire\Tests\CompleteTestSource\DoNotScan\SomeRegisteredController; use Symplify\ControllerAutowire\Tests\CompleteTestSource\Scan\ContainerAwareController; +use Symplify\ControllerAutowire\Tests\CompleteTestSource\Scan\TraitAwareController; use Symplify\ControllerAutowire\Tests\HttpKernel\Controller\ControllerFinderSource\SomeController; use Symplify\ControllerAutowire\Tests\HttpKernel\Controller\ControllerFinderSource\SomeService; @@ -72,6 +76,23 @@ public function testGetAutowiredControllerWithParameter() $this->assertSame(__DIR__, $controller->getKernelRootDir()); } + public function testGetControllerWithTrait() + { + $request = new Request(); + $request->attributes->set( + '_controller', + 'symplify.controllerautowire.tests.completetestsource.scan.traitawarecontroller:someAction' + ); + + /** @var TraitAwareController|ControllerTrait $controller */ + $controller = $this->controllerResolver->getController($request)[0]; + + $this->assertInstanceOf(TraitAwareController::class, $controller); + + $httpKernel = PHPUnit_Framework_Assert::getObjectAttribute($controller, 'httpKernel'); + $this->assertInstanceOf(HttpKernelInterface::class, $httpKernel); + } + /** * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException */ diff --git a/tests/CompleteTestSource/Scan/ContainerAwareController.php b/tests/CompleteTestSource/Scan/ContainerAwareController.php index e5583cf..47275cc 100644 --- a/tests/CompleteTestSource/Scan/ContainerAwareController.php +++ b/tests/CompleteTestSource/Scan/ContainerAwareController.php @@ -14,18 +14,12 @@ final class ContainerAwareController implements ContainerAwareInterface */ private $container; - /** - * {@inheritdoc} - */ public function setContainer(ContainerInterface $container = null) { $this->container = $container; } - /** - * @return ContainerInterface - */ - public function getContainer() + public function getContainer() : ContainerInterface { return $this->container; } diff --git a/tests/CompleteTestSource/Scan/TraitAwareController.php b/tests/CompleteTestSource/Scan/TraitAwareController.php new file mode 100644 index 0000000..8ef7aba --- /dev/null +++ b/tests/CompleteTestSource/Scan/TraitAwareController.php @@ -0,0 +1,16 @@ +controllerFinder->findControllersInDirs([__DIR__ . '/ControllerFinderSource']); - $this->assertArrayHasKey( - 'symplify.controllerautowire.tests.httpkernel.controller.controllerfindersource.somecontroller', - $controllers - ); + $this->assertCount(2, $controllers); + + $this->assertContains(SomeOtherController::class, $controllers); $this->assertContains(SomeController::class, $controllers); $this->assertArrayHasKey( - 'symplify.controllerautowire.tests.httpkernel.controller.controllerfindersource.someothercontroller', + 'symplify.controllerautowire.tests.httpkernel.controller.controllerfindersource.somecontroller', $controllers ); - $this->assertContains(SomeOtherController::class, $controllers); } }