diff --git a/src/Symfony/Bridge/Twig/Command/DebugCommand.php b/src/Symfony/Bridge/Twig/Command/DebugCommand.php index 0c68c637f8c52..da98feb7632bb 100644 --- a/src/Symfony/Bridge/Twig/Command/DebugCommand.php +++ b/src/Symfony/Bridge/Twig/Command/DebugCommand.php @@ -26,6 +26,8 @@ */ class DebugCommand extends Command { + protected static $defaultName = 'debug:twig'; + private $twig; /** @@ -66,7 +68,6 @@ protected function getTwigEnvironment() protected function configure() { $this - ->setName('debug:twig') ->setDefinition(array( new InputArgument('filter', InputArgument::OPTIONAL, 'Show details for all entries matching this filter'), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (text or json)', 'text'), diff --git a/src/Symfony/Bridge/Twig/Command/LintCommand.php b/src/Symfony/Bridge/Twig/Command/LintCommand.php index f96da4d615a29..b747ddaac0254 100644 --- a/src/Symfony/Bridge/Twig/Command/LintCommand.php +++ b/src/Symfony/Bridge/Twig/Command/LintCommand.php @@ -31,6 +31,8 @@ */ class LintCommand extends Command { + protected static $defaultName = 'lint:twig'; + private $twig; /** @@ -71,7 +73,6 @@ protected function getTwigEnvironment() protected function configure() { $this - ->setName('lint:twig') ->setDescription('Lints a template and outputs encountered errors') ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt') ->addArgument('filename', InputArgument::IS_ARRAY) diff --git a/src/Symfony/Bridge/Twig/composer.json b/src/Symfony/Bridge/Twig/composer.json index e86b4ecddce8f..14f734cdc80ef 100644 --- a/src/Symfony/Bridge/Twig/composer.json +++ b/src/Symfony/Bridge/Twig/composer.json @@ -33,13 +33,14 @@ "symfony/security": "~2.8|~3.0|~4.0", "symfony/security-acl": "~2.8|~3.0", "symfony/stopwatch": "~2.8|~3.0|~4.0", - "symfony/console": "~2.8|~3.0|~4.0", + "symfony/console": "~3.4|~4.0", "symfony/var-dumper": "~2.8.10|~3.1.4|~3.2|~4.0", "symfony/expression-language": "~2.8|~3.0|~4.0", "symfony/web-link": "~3.3|~4.0" }, "conflict": { - "symfony/form": "<3.2.10|~3.3,<3.3.3" + "symfony/form": "<3.2.10|~3.3,<3.3.3", + "symfony/console": "<3.4" }, "suggest": { "symfony/finder": "", diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php index 3b9130a8e40a8..4a594d3ae70ce 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AboutCommand.php @@ -28,15 +28,14 @@ */ class AboutCommand extends ContainerAwareCommand { + protected static $defaultName = 'about'; + /** * {@inheritdoc} */ protected function configure() { - $this - ->setName('about') - ->setDescription('Displays information about the current project') - ; + $this->setDescription('Displays information about the current project'); } /** diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php index ffc770c7a5a69..e1adbe9e9325a 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/AssetsInstallCommand.php @@ -35,6 +35,8 @@ class AssetsInstallCommand extends ContainerAwareCommand const METHOD_ABSOLUTE_SYMLINK = 'absolute symlink'; const METHOD_RELATIVE_SYMLINK = 'relative symlink'; + protected static $defaultName = 'assets:install'; + private $filesystem; /** @@ -61,7 +63,6 @@ public function __construct($filesystem = null) protected function configure() { $this - ->setName('assets:install') ->setDefinition(array( new InputArgument('target', InputArgument::OPTIONAL, 'The target directory', 'public'), )) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php index 77ae66867c660..edb6aaded4f60 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.php @@ -31,6 +31,8 @@ */ class CacheClearCommand extends ContainerAwareCommand { + protected static $defaultName = 'cache:clear'; + private $cacheClearer; private $filesystem; @@ -60,7 +62,6 @@ public function __construct($cacheClearer = null, Filesystem $filesystem = null) protected function configure() { $this - ->setName('cache:clear') ->setDefinition(array( new InputOption('no-warmup', '', InputOption::VALUE_NONE, 'Do not warm up the cache'), new InputOption('no-optional-warmers', '', InputOption::VALUE_NONE, 'Skip optional cache warmers (faster)'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/CachePoolClearCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/CachePoolClearCommand.php index fec933f67b9ce..dedd61e668116 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/CachePoolClearCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/CachePoolClearCommand.php @@ -25,6 +25,8 @@ */ final class CachePoolClearCommand extends ContainerAwareCommand { + protected static $defaultName = 'cache:pool:clear'; + private $poolClearer; /** @@ -51,7 +53,6 @@ public function __construct($poolClearer = null) protected function configure() { $this - ->setName('cache:pool:clear') ->setDefinition(array( new InputArgument('pools', InputArgument::IS_ARRAY | InputArgument::REQUIRED, 'A list of cache pools or cache pool clearers'), )) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/CachePoolPruneCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/CachePoolPruneCommand.php index 741979bd4f501..1c9cef9b93eda 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/CachePoolPruneCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/CachePoolPruneCommand.php @@ -24,6 +24,8 @@ */ final class CachePoolPruneCommand extends Command { + protected static $defaultName = 'cache:pool:prune'; + private $pools; /** @@ -42,7 +44,6 @@ public function __construct($pools) protected function configure() { $this - ->setName('cache:pool:prune') ->setDescription('Prune cache pools') ->setHelp(<<<'EOF' The %command.name% command deletes all expired items from all pruneable pools. diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/CacheWarmupCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/CacheWarmupCommand.php index 57972782dc771..1ff474e96939d 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/CacheWarmupCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/CacheWarmupCommand.php @@ -26,6 +26,8 @@ */ class CacheWarmupCommand extends ContainerAwareCommand { + protected static $defaultName = 'cache:warmup'; + private $cacheWarmer; /** @@ -52,7 +54,6 @@ public function __construct($cacheWarmer = null) protected function configure() { $this - ->setName('cache:warmup') ->setDefinition(array( new InputOption('no-optional-warmers', '', InputOption::VALUE_NONE, 'Skip optional cache warmers (faster)'), )) diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php index f460fd5f09a3f..5a55332b334f3 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDebugCommand.php @@ -28,13 +28,14 @@ */ class ConfigDebugCommand extends AbstractConfigCommand { + protected static $defaultName = 'debug:config'; + /** * {@inheritdoc} */ protected function configure() { $this - ->setName('debug:config') ->setDefinition(array( new InputArgument('name', InputArgument::OPTIONAL, 'The bundle name or the extension alias'), new InputArgument('path', InputArgument::OPTIONAL, 'The configuration option path'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php index fb51f8c3fcf0c..62bdfec8c9c99 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ConfigDumpReferenceCommand.php @@ -30,13 +30,14 @@ */ class ConfigDumpReferenceCommand extends AbstractConfigCommand { + protected static $defaultName = 'config:dump-reference'; + /** * {@inheritdoc} */ protected function configure() { $this - ->setName('config:dump-reference') ->setDefinition(array( new InputArgument('name', InputArgument::OPTIONAL, 'The Bundle name or the extension alias'), new InputArgument('path', InputArgument::OPTIONAL, 'The configuration option path'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php index 51c04969877e6..ed859880cb00e 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php @@ -32,6 +32,8 @@ */ class ContainerDebugCommand extends ContainerAwareCommand { + protected static $defaultName = 'debug:container'; + /** * @var ContainerBuilder|null */ @@ -43,7 +45,6 @@ class ContainerDebugCommand extends ContainerAwareCommand protected function configure() { $this - ->setName('debug:container') ->setDefinition(array( new InputArgument('name', InputArgument::OPTIONAL, 'A service name (foo)'), new InputOption('show-private', null, InputOption::VALUE_NONE, 'Used to show public *and* private services'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/EventDispatcherDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/EventDispatcherDebugCommand.php index 18aa08575c4e0..a36878d44533c 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/EventDispatcherDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/EventDispatcherDebugCommand.php @@ -28,6 +28,7 @@ */ class EventDispatcherDebugCommand extends ContainerAwareCommand { + protected static $defaultName = 'debug:event-dispatcher'; private $dispatcher; /** @@ -54,7 +55,6 @@ public function __construct($dispatcher = null) protected function configure() { $this - ->setName('debug:event-dispatcher') ->setDefinition(array( new InputArgument('event', InputArgument::OPTIONAL, 'An event name'), new InputOption('format', null, InputOption::VALUE_REQUIRED, 'The output format (txt, xml, json, or md)', 'txt'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php index 2a005090322dd..03b227a731ce7 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/RouterDebugCommand.php @@ -32,6 +32,7 @@ */ class RouterDebugCommand extends ContainerAwareCommand { + protected static $defaultName = 'debug:router'; private $router; /** @@ -79,7 +80,6 @@ public function isEnabled() protected function configure() { $this - ->setName('debug:router') ->setDefinition(array( new InputArgument('name', InputArgument::OPTIONAL, 'A route name'), new InputOption('show-controllers', null, InputOption::VALUE_NONE, 'Show assigned controllers in overview'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/RouterMatchCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/RouterMatchCommand.php index f88d2a2dfe0c7..ee5c4990a487b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/RouterMatchCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/RouterMatchCommand.php @@ -29,6 +29,8 @@ */ class RouterMatchCommand extends ContainerAwareCommand { + protected static $defaultName = 'router:match'; + private $router; /** @@ -76,7 +78,6 @@ public function isEnabled() protected function configure() { $this - ->setName('router:match') ->setDefinition(array( new InputArgument('path_info', InputArgument::REQUIRED, 'A path info'), new InputOption('method', null, InputOption::VALUE_REQUIRED, 'Sets the HTTP method'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/TranslationDebugCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/TranslationDebugCommand.php index f8e69a3c4a640..cbf6bda5f3fff 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/TranslationDebugCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/TranslationDebugCommand.php @@ -40,6 +40,8 @@ class TranslationDebugCommand extends ContainerAwareCommand const MESSAGE_UNUSED = 1; const MESSAGE_EQUALS_FALLBACK = 2; + protected static $defaultName = 'debug:translation'; + private $translator; private $loader; private $extractor; @@ -72,7 +74,6 @@ public function __construct($translator = null, TranslationLoader $loader = null protected function configure() { $this - ->setName('debug:translation') ->setDefinition(array( new InputArgument('locale', InputArgument::REQUIRED, 'The locale'), new InputArgument('bundle', InputArgument::OPTIONAL, 'The bundle name or directory where to load the messages, defaults to app/Resources folder'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php index 357902a209305..20d5ffa8b031b 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/TranslationUpdateCommand.php @@ -33,6 +33,8 @@ */ class TranslationUpdateCommand extends ContainerAwareCommand { + protected static $defaultName = 'translation:update'; + private $writer; private $loader; private $extractor; @@ -68,7 +70,6 @@ public function __construct($writer = null, TranslationLoader $loader = null, Ex protected function configure() { $this - ->setName('translation:update') ->setDefinition(array( new InputArgument('locale', InputArgument::REQUIRED, 'The locale'), new InputArgument('bundle', InputArgument::OPTIONAL, 'The bundle name or directory where to load the messages, defaults to app/Resources folder'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/WorkflowDumpCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/WorkflowDumpCommand.php index 27e0f645d8fdf..9923f657794f8 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/WorkflowDumpCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/WorkflowDumpCommand.php @@ -25,6 +25,8 @@ */ class WorkflowDumpCommand extends ContainerAwareCommand { + protected static $defaultName = 'workflow:dump'; + /** * {@inheritdoc} * @@ -41,7 +43,6 @@ public function isEnabled() protected function configure() { $this - ->setName('workflow:dump') ->setDefinition(array( new InputArgument('name', InputArgument::REQUIRED, 'A workflow name'), new InputArgument('marking', InputArgument::IS_ARRAY, 'A marking (a list of places)'), diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/XliffLintCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/XliffLintCommand.php index 36876dee24252..2093c3d262302 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/XliffLintCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/XliffLintCommand.php @@ -24,6 +24,8 @@ */ class XliffLintCommand extends BaseLintCommand { + protected static $defaultName = 'lint:xliff'; + public function __construct($name = null, $directoryIteratorProvider = null, $isReadableProvider = null) { if (func_num_args()) { diff --git a/src/Symfony/Bundle/FrameworkBundle/Command/YamlLintCommand.php b/src/Symfony/Bundle/FrameworkBundle/Command/YamlLintCommand.php index f6c1a7f85b190..e54a0058cabcc 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Command/YamlLintCommand.php +++ b/src/Symfony/Bundle/FrameworkBundle/Command/YamlLintCommand.php @@ -23,6 +23,8 @@ */ class YamlLintCommand extends BaseLintCommand { + protected static $defaultName = 'lint:yaml'; + public function __construct($name = null, $directoryIteratorProvider = null, $isReadableProvider = null) { if (func_num_args()) { diff --git a/src/Symfony/Bundle/SecurityBundle/Command/InitAclCommand.php b/src/Symfony/Bundle/SecurityBundle/Command/InitAclCommand.php index 597df8ceb9de1..c8ccac32cab5b 100644 --- a/src/Symfony/Bundle/SecurityBundle/Command/InitAclCommand.php +++ b/src/Symfony/Bundle/SecurityBundle/Command/InitAclCommand.php @@ -27,6 +27,8 @@ */ class InitAclCommand extends ContainerAwareCommand { + protected static $defaultName = 'init:acl'; + private $connection; private $schema; @@ -70,7 +72,6 @@ public function isEnabled() protected function configure() { $this - ->setName('init:acl') ->setDescription('Mounts ACL tables in the database') ->setHelp(<<<'EOF' The %command.name% command mounts ACL tables in the database. diff --git a/src/Symfony/Bundle/SecurityBundle/Command/SetAclCommand.php b/src/Symfony/Bundle/SecurityBundle/Command/SetAclCommand.php index 840e74edfba87..bdb293a4ec6fd 100644 --- a/src/Symfony/Bundle/SecurityBundle/Command/SetAclCommand.php +++ b/src/Symfony/Bundle/SecurityBundle/Command/SetAclCommand.php @@ -32,6 +32,8 @@ */ class SetAclCommand extends ContainerAwareCommand { + protected static $defaultName = 'acl:set'; + private $provider; /** @@ -80,7 +82,6 @@ public function isEnabled() protected function configure() { $this - ->setName('acl:set') ->setDescription('Sets ACL for objects') ->setHelp(<<%command.name% command sets ACL. diff --git a/src/Symfony/Bundle/SecurityBundle/Command/UserPasswordEncoderCommand.php b/src/Symfony/Bundle/SecurityBundle/Command/UserPasswordEncoderCommand.php index 1f6a5d3c6213b..c93cb4987f481 100644 --- a/src/Symfony/Bundle/SecurityBundle/Command/UserPasswordEncoderCommand.php +++ b/src/Symfony/Bundle/SecurityBundle/Command/UserPasswordEncoderCommand.php @@ -19,7 +19,6 @@ use Symfony\Component\Console\Output\OutputInterface; use Symfony\Component\Console\Question\Question; use Symfony\Component\Console\Style\SymfonyStyle; -use Symfony\Component\DependencyInjection\ContainerAwareInterface; use Symfony\Component\Security\Core\Encoder\BCryptPasswordEncoder; use Symfony\Component\Security\Core\Encoder\EncoderFactoryInterface; use Symfony\Component\Security\Core\User\User; @@ -33,6 +32,8 @@ */ class UserPasswordEncoderCommand extends ContainerAwareCommand { + protected static $defaultName = 'security:encode-password'; + private $encoderFactory; private $userClasses; @@ -54,7 +55,6 @@ public function __construct(EncoderFactoryInterface $encoderFactory = null, arra protected function configure() { $this - ->setName('security:encode-password') ->setDescription('Encodes a password.') ->addArgument('password', InputArgument::OPTIONAL, 'The plain password to encode.') ->addArgument('user-class', InputArgument::OPTIONAL, 'The User entity class path associated with the encoder used to encode the password.') diff --git a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/SetAclCommandTest.php b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/SetAclCommandTest.php index 1ceaca1002019..5ecbf47078afe 100644 --- a/src/Symfony/Bundle/SecurityBundle/Tests/Functional/SetAclCommandTest.php +++ b/src/Symfony/Bundle/SecurityBundle/Tests/Functional/SetAclCommandTest.php @@ -20,7 +20,6 @@ * file that was distributed with this source code. */ use Symfony\Bundle\FrameworkBundle\Console\Application; -use Symfony\Bundle\SecurityBundle\Command\InitAclCommand; use Symfony\Bundle\SecurityBundle\Command\SetAclCommand; use Symfony\Component\Console\Tester\CommandTester; use Symfony\Component\Security\Acl\Domain\ObjectIdentity; @@ -170,7 +169,6 @@ private function getApplication() $kernel->boot(); $application = new Application($kernel); - $application->add(new InitAclCommand($kernel->getContainer()->get('security.acl.dbal.connection'), $kernel->getContainer()->get('security.acl.dbal.schema'))); $initAclCommand = $application->find('init:acl'); $initAclCommandTester = new CommandTester($initAclCommand); diff --git a/src/Symfony/Bundle/SecurityBundle/composer.json b/src/Symfony/Bundle/SecurityBundle/composer.json index b1421742766de..38bf0220536d5 100644 --- a/src/Symfony/Bundle/SecurityBundle/composer.json +++ b/src/Symfony/Bundle/SecurityBundle/composer.json @@ -26,7 +26,7 @@ "require-dev": { "symfony/asset": "~2.8|~3.0|~4.0", "symfony/browser-kit": "~2.8|~3.0|~4.0", - "symfony/console": "~3.2|~4.0", + "symfony/console": "~3.4|~4.0", "symfony/css-selector": "~2.8|~3.0|~4.0", "symfony/dom-crawler": "~2.8|~3.0|~4.0", "symfony/event-dispatcher": "^3.3.1|~4.0", @@ -47,7 +47,8 @@ }, "conflict": { "symfony/var-dumper": "<3.3", - "symfony/event-dispatcher": "<3.3.1" + "symfony/event-dispatcher": "<3.3.1", + "symfony/console": "<3.4" }, "suggest": { "symfony/security-acl": "For using the ACL functionality of this bundle" diff --git a/src/Symfony/Component/Console/CHANGELOG.md b/src/Symfony/Component/Console/CHANGELOG.md index 0c147a605ccb2..24d7ff7af40e0 100644 --- a/src/Symfony/Component/Console/CHANGELOG.md +++ b/src/Symfony/Component/Console/CHANGELOG.md @@ -7,6 +7,10 @@ CHANGELOG * added `CommandLoaderInterface`, `FactoryCommandLoader` and PSR-11 `ContainerCommandLoader` for commands lazy-loading * added a case-insensitive command name matching fallback + * added static `Command::$defaultName/getDefaultName()`, allowing for + commands to be registered at compile time in the application command loader. + Setting the `$defaultName` property avoids the need for filling the `command` + attribute on the `console.command` tag when using `AddConsoleCommandPass`. 3.3.0 ----- diff --git a/src/Symfony/Component/Console/Command/Command.php b/src/Symfony/Component/Console/Command/Command.php index 6620ff5718c53..bd7059602d2f8 100644 --- a/src/Symfony/Component/Console/Command/Command.php +++ b/src/Symfony/Component/Console/Command/Command.php @@ -29,6 +29,11 @@ */ class Command { + /** + * @var string|null The default command name + */ + protected static $defaultName; + private $application; private $name; private $processTitle; @@ -45,6 +50,17 @@ class Command private $usages = array(); private $helperSet; + /** + * @return string|null The default command name or null when no default name is set + */ + public static function getDefaultName() + { + $class = get_called_class(); + $r = new \ReflectionProperty($class, 'defaultName'); + + return $class === $r->class ? static::$defaultName : null; + } + /** * Constructor. * @@ -56,7 +72,7 @@ public function __construct($name = null) { $this->definition = new InputDefinition(); - if (null !== $name) { + if (null !== $name || null !== $name = static::getDefaultName()) { $this->setName($name); } diff --git a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php index 67034098c218a..add7c5d0df491 100644 --- a/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php +++ b/src/Symfony/Component/Console/DependencyInjection/AddConsoleCommandPass.php @@ -46,16 +46,21 @@ public function process(ContainerBuilder $container) $definition = $container->getDefinition($id); $class = $container->getParameterBag()->resolveValue($definition->getClass()); - if (!$r = $container->getReflectionClass($class)) { - throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); - } - if (!$r->isSubclassOf(Command::class)) { - throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); - } - $commandId = 'console.command.'.strtolower(str_replace('\\', '_', $class)); - if (!isset($tags[0]['command'])) { + if (isset($tags[0]['command'])) { + $commandName = $tags[0]['command']; + } else { + if (!$r = $container->getReflectionClass($class)) { + throw new InvalidArgumentException(sprintf('Class "%s" used for service "%s" cannot be found.', $class, $id)); + } + if (!$r->isSubclassOf(Command::class)) { + throw new InvalidArgumentException(sprintf('The service "%s" tagged "%s" must be a subclass of "%s".', $id, $this->commandTag, Command::class)); + } + $commandName = $class::getDefaultName(); + } + + if (null === $commandName) { if (isset($serviceIds[$commandId]) || $container->hasAlias($commandId)) { $commandId = $commandId.'_'.$id; } @@ -69,7 +74,6 @@ public function process(ContainerBuilder $container) } $serviceIds[$commandId] = false; - $commandName = $tags[0]['command']; unset($tags[0]); $lazyCommandMap[$commandName] = $id; $lazyCommandRefs[$id] = new TypedReference($id, $class); diff --git a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php index ddcee80145e53..807eb389730fe 100644 --- a/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php +++ b/src/Symfony/Component/Console/Tests/DependencyInjection/AddConsoleCommandPassTest.php @@ -77,6 +77,38 @@ public function testProcessRegistersLazyCommands() $this->assertSame(array(array('setName', array('my:command')), array('setAliases', array(array('my:alias')))), $command->getMethodCalls()); } + public function testProcessFallsBackToDefaultName() + { + $container = new ContainerBuilder(); + $container + ->register('with-default-name', NamedCommand::class) + ->setPublic(false) + ->addTag('console.command') + ; + + $pass = new AddConsoleCommandPass(); + $pass->process($container); + + $commandLoader = $container->getDefinition('console.command_loader'); + $commandLocator = $container->getDefinition((string) $commandLoader->getArgument(0)); + + $this->assertSame(ContainerCommandLoader::class, $commandLoader->getClass()); + $this->assertSame(array('default' => 'with-default-name'), $commandLoader->getArgument(1)); + $this->assertEquals(array(array('with-default-name' => new ServiceClosureArgument(new TypedReference('with-default-name', NamedCommand::class)))), $commandLocator->getArguments()); + $this->assertSame(array('console.command.symfony_component_console_tests_dependencyinjection_namedcommand' => false), $container->getParameter('console.command.ids')); + + $container = new ContainerBuilder(); + $container + ->register('with-default-name', NamedCommand::class) + ->setPublic(false) + ->addTag('console.command', array('command' => 'new-name')) + ; + + $pass->process($container); + + $this->assertSame(array('new-name' => 'with-default-name'), $container->getDefinition('console.command_loader')->getArgument(1)); + } + public function visibilityProvider() { return array( @@ -96,7 +128,7 @@ public function testProcessThrowAnExceptionIfTheServiceIsAbstract() $container->addCompilerPass(new AddConsoleCommandPass()); $definition = new Definition('Symfony\Component\Console\Tests\DependencyInjection\MyCommand'); - $definition->addTag('console.command', array('command' => 'my:command')); + $definition->addTag('console.command'); $definition->setAbstract(true); $container->setDefinition('my-command', $definition); @@ -114,7 +146,7 @@ public function testProcessThrowAnExceptionIfTheServiceIsNotASubclassOfCommand() $container->addCompilerPass(new AddConsoleCommandPass()); $definition = new Definition('SplObjectStorage'); - $definition->addTag('console.command', array('command' => 'my:command')); + $definition->addTag('console.command'); $container->setDefinition('my-command', $definition); $container->compile(); @@ -146,3 +178,8 @@ public function testProcessPrivateServicesWithSameCommand() class MyCommand extends Command { } + +class NamedCommand extends Command +{ + protected static $defaultName = 'default'; +} diff --git a/src/Symfony/Component/Translation/Command/XliffLintCommand.php b/src/Symfony/Component/Translation/Command/XliffLintCommand.php index 80d8bb25dca2b..fead5edcb18bb 100644 --- a/src/Symfony/Component/Translation/Command/XliffLintCommand.php +++ b/src/Symfony/Component/Translation/Command/XliffLintCommand.php @@ -26,6 +26,8 @@ */ class XliffLintCommand extends Command { + protected static $defaultName = 'lint:xliff'; + private $format; private $displayCorrectFiles; private $directoryIteratorProvider; @@ -45,7 +47,6 @@ public function __construct($name = null, $directoryIteratorProvider = null, $is protected function configure() { $this - ->setName('lint:xliff') ->setDescription('Lints a XLIFF file and outputs encountered errors') ->addArgument('filename', null, 'A file or a directory or STDIN') ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt') diff --git a/src/Symfony/Component/Yaml/Command/LintCommand.php b/src/Symfony/Component/Yaml/Command/LintCommand.php index 36025bdebb8b7..202291551b57f 100644 --- a/src/Symfony/Component/Yaml/Command/LintCommand.php +++ b/src/Symfony/Component/Yaml/Command/LintCommand.php @@ -28,6 +28,8 @@ */ class LintCommand extends Command { + protected static $defaultName = 'lint:yaml'; + private $parser; private $format; private $displayCorrectFiles; @@ -48,7 +50,6 @@ public function __construct($name = null, $directoryIteratorProvider = null, $is protected function configure() { $this - ->setName('lint:yaml') ->setDescription('Lints a file and outputs encountered errors') ->addArgument('filename', null, 'A file or a directory or STDIN') ->addOption('format', null, InputOption::VALUE_REQUIRED, 'The output format', 'txt') diff --git a/src/Symfony/Component/Yaml/composer.json b/src/Symfony/Component/Yaml/composer.json index 41f04fb9f9543..a31a2cef426eb 100644 --- a/src/Symfony/Component/Yaml/composer.json +++ b/src/Symfony/Component/Yaml/composer.json @@ -19,7 +19,10 @@ "php": "^5.5.9|>=7.0.8" }, "require-dev": { - "symfony/console": "~2.8|~3.0|~4.0" + "symfony/console": "~3.4|~4.0" + }, + "conflict": { + "symfony/console": "<3.4" }, "suggest": { "symfony/console": "For validating YAML files using the lint command" pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy