[Console] fixed #10531
This commit is contained in:
parent
1b39930dad
commit
e6afff4f08
@ -469,10 +469,10 @@ class Application
|
|||||||
{
|
{
|
||||||
$namespaces = array();
|
$namespaces = array();
|
||||||
foreach ($this->commands as $command) {
|
foreach ($this->commands as $command) {
|
||||||
$namespaces[] = $this->extractNamespace($command->getName());
|
$namespaces = array_merge($namespaces, $this->extractAllNamespaces($command->getName()));
|
||||||
|
|
||||||
foreach ($command->getAliases() as $alias) {
|
foreach ($command->getAliases() as $alias) {
|
||||||
$namespaces[] = $this->extractNamespace($alias);
|
$namespaces = array_merge($namespaces, $this->extractAllNamespaces($alias));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1169,4 +1169,28 @@ class Application
|
|||||||
|
|
||||||
return $lines;
|
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.'/Foo2Command.php';
|
||||||
require_once self::$fixturesPath.'/Foo3Command.php';
|
require_once self::$fixturesPath.'/Foo3Command.php';
|
||||||
require_once self::$fixturesPath.'/Foo4Command.php';
|
require_once self::$fixturesPath.'/Foo4Command.php';
|
||||||
|
require_once self::$fixturesPath.'/FooSubnamespaced1Command.php';
|
||||||
|
require_once self::$fixturesPath.'/FooSubnamespaced2Command.php';
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function normalizeLineBreaks($text)
|
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');
|
$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
|
* @expectedException \InvalidArgumentException
|
||||||
* @expectedExceptionMessage The namespace "f" is ambiguous (foo, foo1).
|
* @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
Block a user