New in Symfony 5.3: Lazy Command Description

Contributed by
Nicolas Grekas
in #39851.

Symfony introduced lazy commands back in 2017 for its 3.4 version. That
change made applications faster and more robust because commands no longer
needed to be instantiated to register them in the application.

However, Symfony commands aren’t fully lazy. If you run bin/console without
arguments (or the equivalent bin/console list command) you see the entire
list of commands registered in the application and their descriptions. This
requires instantiating all commands, because their description is not lazy.

You might think that this is not important, because you rarely list commands
and it’s OK if it takes a few milliseconds to run. That’s true, but this
makes it harder/impossible to implement another feature that we want to include
in future Symfony versions: console autocompletion.

That’s why in Symfony 5.3 we’ve introduced a way to define command descriptions
(and command aliases) lazily, like the command name. First, you can now add the
description attribute to the console.command tag when defining the
command in a configuration file:

1
2
3
4
5
# config/services.yaml
app.command.my_command:
# …
tags:
{ name: console.command, command: app:my-command, description: ‚…‘ }

If you prefer to define all this inside the command class, add the new
$defaultDescription static property:

1
2
3
4
5
6
7
8
9
10
11
12
// src/Command/MyCommand.php
namespace AppCommand;

use SymfonyComponentConsoleCommandCommand;

class MyCommand extends Command
{
protected static $defaultName = ‚app:my-command‘;
protected static $defaultDescription = ‚…‘;

// …
}

You can now define command aliases lazily too (which will also be important for
the future console autocompletion). To do so, add the aliases inside the
$defaultName property separated with pipe characters (|):

1
protected static $defaultName = ‚app:my-command|project:my-command|legacy:foo‘;

If your application uses PHP 8, keep in mind that you have another way of
defining this lazy command configuration with the AsCommand attribute:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// src/Command/MyCommand.php
namespace AppCommand;

use SymfonyComponentConsoleAttributeAsCommand;
use SymfonyComponentConsoleCommandCommand;

#[AsCommand(
name: ‚app:my-command‘,
description: ‚…‘,
aliases: [‚project:my-command‘, ‚legacy:foo‘]
)]
class MyCommand extends Command
{
// …
}

Sponsor the Symfony project.

Symfony Blog
Read More

Generated by Feedzy