Feature: #89139 - Add dependency injection support for console commands

See Issue #89139

Description

Support for dependency injection in console commands has been added.

Command dependencies can now be injected via constructor or other injection techniques. Therefore, a new dependency injection tag console.command has been added. Commands tagged with console.command are lazy loaded. That means they will only be instantiated when they are actually executed, when the help subcommand is executed, or when available schedulable commands are iterated.

The legacy command definition format Configuration/Commands.php has been marked as deprecated.

Impact

It is recommended to configure dependency injection tags for all commands, as the legacy command definition format Configuration/Commands.php will be removed in TYPO3 v11.

Commands that have been configured via console.command tag override legacy commands from Configuration/Commands.php without triggering a PHP E_USER_DEPRECATED error for those commands. Backwards compatibility with older TYPO3 version can be achieved by specifying both variants, legacy configuration in Configuration/Commands.php and new configuration via console.command tag.

Usage

Add the console.command tag to command classes. Use the tag attribute command to specify the command name. The optional tag attribute schedulable may be set to false to exclude the command from the TYPO3 scheduler.

your_extension/Configuration/Services.yaml

services:
  _defaults:
    autowire: true
    autoconfigure: true
    public: false

  MyVendor\MyExt\Command\FooCommand:
    tags:
      - name: 'console.command'
        command: 'my:command'
        schedulable: false

Command aliases are to be configured as separate tags. The optional tag attribute alias should be set to true for alias commands.

MyVendor\MyExt\Command\BarCommand:
  tags:
    - name: 'console.command'
      command: 'my:bar'
    - name: 'console.command'
      command: 'my:old-bar-command'
      alias: true
      schedulable: false