refactor ControllerNameParser
This commit is contained in:
parent
a6930a3c45
commit
35e19c76c3
@ -38,6 +38,11 @@ class ControllerNameParser
|
|||||||
* Converts a short notation a:b:c to a class::method.
|
* Converts a short notation a:b:c to a class::method.
|
||||||
*
|
*
|
||||||
* @param string $controller A short notation controller (a:b:c)
|
* @param string $controller A short notation controller (a:b:c)
|
||||||
|
*
|
||||||
|
* @return string A string with class::method
|
||||||
|
*
|
||||||
|
* @throws \InvalidArgumentException when the specified bundle is not enabled
|
||||||
|
* or the controller cannot be found
|
||||||
*/
|
*/
|
||||||
public function parse($controller)
|
public function parse($controller)
|
||||||
{
|
{
|
||||||
@ -47,40 +52,23 @@ class ControllerNameParser
|
|||||||
|
|
||||||
list($bundle, $controller, $action) = $parts;
|
list($bundle, $controller, $action) = $parts;
|
||||||
$controller = str_replace('/', '\\', $controller);
|
$controller = str_replace('/', '\\', $controller);
|
||||||
$class = null;
|
$bundles = array();
|
||||||
$logs = array();
|
|
||||||
|
// this throws an exception if there is no such bundle
|
||||||
foreach ($this->kernel->getBundle($bundle, false) as $b) {
|
foreach ($this->kernel->getBundle($bundle, false) as $b) {
|
||||||
$try = $b->getNamespace().'\\Controller\\'.$controller.'Controller';
|
$try = $b->getNamespace().'\\Controller\\'.$controller.'Controller';
|
||||||
if (!class_exists($try)) {
|
if (class_exists($try)) {
|
||||||
$logs[] = sprintf('Unable to find controller "%s:%s" - class "%s" does not exist.', $bundle, $controller, $try);
|
return $try.'::'.$action.'Action';
|
||||||
} else {
|
|
||||||
$class = $try;
|
|
||||||
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$bundles[] = $b->getName();
|
||||||
|
$msg = sprintf('Unable to find controller "%s:%s" - class "%s" does not exist.', $bundle, $controller, $try);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (null === $class) {
|
if (count($bundles) > 1) {
|
||||||
$this->handleControllerNotFoundException($bundle, $controller, $logs);
|
$msg = sprintf('Unable to find controller "%s:%s" in bundles %s.', $bundle, $controller, implode(', ', $bundles));
|
||||||
}
|
}
|
||||||
|
|
||||||
return $class.'::'.$action.'Action';
|
|
||||||
}
|
|
||||||
|
|
||||||
private function handleControllerNotFoundException($bundle, $controller, array $logs)
|
|
||||||
{
|
|
||||||
// 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);
|
throw new \InvalidArgumentException($msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user