[Console] fixed #10531
This commit is contained in:
parent
1b39930dad
commit
e6afff4f08
|
@ -469,10 +469,10 @@ class Application
|
|||
{
|
||||
$namespaces = array();
|
||||
foreach ($this->commands as $command) {
|
||||
$namespaces[] = $this->extractNamespace($command->getName());
|
||||
$namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
|
||||
|
||||
foreach ($command->getAliases() as $alias) {
|
||||
$namespaces[] = $this->extractNamespace($alias);
|
||||
$namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1169,4 +1169,28 @@ class Application
|
|||
|
||||
return $lines;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns all namespaces of the command name.
|
||||
*
|
||||
* @param string $name The full name of the command
|
||||
*
|
||||
* @return array The namespaces of the command
|
||||
*/
|
||||
private function extractAllNamespaces($name)
|
||||
{
|
||||
// -1 as third argument is needed to skip the command short name when exploding
|
||||
$parts = explode(':', $name, -1);
|
||||
$namespaces = array();
|
||||
|
||||
foreach ($parts as $part) {
|
||||
if (count($namespaces)) {
|
||||
$namespaces[] = end($namespaces).':'.$part;
|
||||
} else {
|
||||
$namespaces[] = $part;
|
||||
}
|
||||
}
|
||||
|
||||
return $namespaces;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -40,6 +40,8 @@ class ApplicationTest extends \PHPUnit_Framework_TestCase
|
|||
require_once self::$fixturesPath.'/Foo2Command.php';
|
||||
require_once self::$fixturesPath.'/Foo3Command.php';
|
||||
require_once self::$fixturesPath.'/Foo4Command.php';
|
||||
require_once self::$fixturesPath.'/FooSubnamespaced1Command.php';
|
||||
require_once self::$fixturesPath.'/FooSubnamespaced2Command.php';
|
||||
}
|
||||
|
||||
protected function normalizeLineBreaks($text)
|
||||
|
@ -186,6 +188,14 @@ class ApplicationTest extends \PHPUnit_Framework_TestCase
|
|||
$this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns the given namespace if it exists');
|
||||
}
|
||||
|
||||
public function testFindNamespaceWithSubnamespaces()
|
||||
{
|
||||
$application = new Application();
|
||||
$application->add(new \FooSubnamespaced1Command());
|
||||
$application->add(new \FooSubnamespaced2Command());
|
||||
$this->assertEquals('foo', $application->findNamespace('foo'), '->findNamespace() returns commands even if the commands are only contained in subnamespaces');
|
||||
}
|
||||
|
||||
/**
|
||||
* @expectedException \InvalidArgumentException
|
||||
* @expectedExceptionMessage The namespace "f" is ambiguous (foo, foo1).
|
||||
|
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class FooSubnamespaced1Command extends Command
|
||||
{
|
||||
public $input;
|
||||
public $output;
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('foo:bar:baz')
|
||||
->setDescription('The foo:bar:baz command')
|
||||
->setAliases(array('foobarbaz'))
|
||||
;
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$this->input = $input;
|
||||
$this->output = $output;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
<?php
|
||||
|
||||
use Symfony\Component\Console\Command\Command;
|
||||
use Symfony\Component\Console\Input\InputInterface;
|
||||
use Symfony\Component\Console\Output\OutputInterface;
|
||||
|
||||
class FooSubnamespaced2Command extends Command
|
||||
{
|
||||
public $input;
|
||||
public $output;
|
||||
|
||||
protected function configure()
|
||||
{
|
||||
$this
|
||||
->setName('foo:go:bret')
|
||||
->setDescription('The foo:bar:go command')
|
||||
->setAliases(array('foobargo'))
|
||||
;
|
||||
}
|
||||
|
||||
protected function execute(InputInterface $input, OutputInterface $output)
|
||||
{
|
||||
$this->input = $input;
|
||||
$this->output = $output;
|
||||
}
|
||||
}
|
Reference in New Issue