diff --git a/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerNameParser.php b/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerNameParser.php index 5691593800..86dd9cea24 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerNameParser.php +++ b/src/Symfony/Bundle/FrameworkBundle/Controller/ControllerNameParser.php @@ -58,7 +58,7 @@ class ControllerNameParser $try = $b->getNamespace().'\\Controller\\'.$controller.'Controller'; if (!class_exists($try)) { if (null !== $this->logger) { - $logs[] = sprintf('Failed finding controller "%s:%s" from namespace "%s" (%s)', $bundle, $controller, $b->getNamespace(), $try); + $logs[] = sprintf('Unable to find controller "%s:%s" - class "%s" does not exist.', $bundle, $controller, $try); } } else { $class = $try; @@ -68,15 +68,32 @@ class ControllerNameParser } if (null === $class) { - if (null !== $this->logger) { - foreach ($logs as $log) { - $this->logger->info($log); - } - } - - throw new \InvalidArgumentException(sprintf('Unable to find controller "%s:%s".', $bundle, $controller)); + $this->handleControllerNotFoundException($bundle, $controller, $logs); } return $class.'::'.$action.'Action'; } + + private function handleControllerNotFoundException($bundle, $controller, array $logs) + { + if (null !== $this->logger) { + foreach ($logs as $log) { + $this->logger->info($log); + } + } + + // just one log, return it as the exception + if (1 == count($logs)) { + throw new \InvalidArgumentException($logs[0]); + } + + // many logs, use a message that mentions each searched bundle + $names = array(); + foreach ($this->kernel->getBundle($bundle, false) as $b) { + $names[] = $b->getName(); + } + $msg = sprintf('Unable to find controller "%s:%s" in bundles %s.', $bundle, $controller, implode(', ', $names)); + + throw new \InvalidArgumentException($msg); + } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerNameParserTest.php b/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerNameParserTest.php index e61739044f..159e999d3f 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerNameParserTest.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/Controller/ControllerNameParserTest.php @@ -23,10 +23,7 @@ class ControllerNameParserTest extends TestCase { public function testParse() { - $kernel = new Kernel(); - $kernel->boot(); - $logger = new Logger(); - $parser = new ControllerNameParser($kernel, $logger); + $parser = $this->createParser(); $this->assertEquals('TestBundle\FooBundle\Controller\DefaultController::indexAction', $parser->parse('FooBundle:Default:index'), '->parse() converts a short a:b:c notation string to a class::method string'); $this->assertEquals('TestBundle\FooBundle\Controller\Sub\DefaultController::indexAction', $parser->parse('FooBundle:Sub\Default:index'), '->parse() converts a short a:b:c notation string to a class::method string'); @@ -39,12 +36,37 @@ class ControllerNameParserTest extends TestCase } catch (\Exception $e) { $this->assertInstanceOf('\InvalidArgumentException', $e, '->parse() throws an \InvalidArgumentException if the controller is not an a:b:c string'); } + } + + /** + * @dataProvider getMissingControllersTest + */ + public function testMissingControllers($name) + { + $parser = $this->createParser(); try { - $parser->parse('BarBundle:Default:index'); - $this->fail('->parse() throws a \InvalidArgumentException if the class is found but does not exist'); + $parser->parse($name); + $this->fail('->parse() throws a \InvalidArgumentException if the string is in the valid format, but not matching class can be found'); } catch (\Exception $e) { - $this->assertInstanceOf('\InvalidArgumentException', $e, '->parse() throws a \LogicException if the class is found but does not exist'); + $this->assertInstanceOf('\InvalidArgumentException', $e, '->parse() throws a \InvalidArgumentException if the class is found but does not exist'); } } + + public function getMissingControllersTest() + { + return array( + array('FooBundle:Fake:index'), // a normal bundle + array('SensioFooBundle:Fake:index'), // a bundle with children + ); + } + + private function createParser() + { + $kernel = new Kernel(); + $kernel->boot(); + $logger = new Logger(); + + return new ControllerNameParser($kernel, $logger); + } }