.. index:: single: Console; Commands as Services How to Define Commands as Services ================================== If you're using the :ref:`default services.yaml configuration `, your command classes are already registered as services. Great! This is the recommended setup. .. note:: You can also manually register your command as a service by configuring the service and :doc:`tagging it ` with ``console.command``. For example, suppose you want to log something from within your command:: namespace App\Command; use Psr\Log\LoggerInterface; use Symfony\Component\Console\Command\Command; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Output\OutputInterface; class SunshineCommand extends Command { protected static $defaultName = 'app:sunshine'; private $logger; public function __construct(LoggerInterface $logger) { $this->logger = $logger; // you *must* call the parent constructor parent::__construct(); } protected function configure() { $this ->setDescription('Good morning!'); } protected function execute(InputInterface $input, OutputInterface $output) { $this->logger->info('Waking up the sun'); // ... } } If you're using the :ref:`default services.yaml configuration `, the command class will automatically be registered as a service and passed the ``$logger`` argument (thanks to autowiring). In other words, *just* by creating this class, everything works! You can call the ``app:sunshine`` command and start logging. .. caution:: You *do* have access to services in ``configure()``. However, if your command is not :ref:`lazy `, try to avoid doing any work (e.g. making database queries), as that code will be run, even if you're using the console to execute a different command. .. _console-command-service-lazy-loading: Lazy Loading ------------ To make your command lazily loaded, either define its ``$defaultName`` static property:: class SunshineCommand extends Command { protected static $defaultName = 'app:sunshine'; // ... } Or set the ``command`` attribute on the ``console.command`` tag in your service definition: .. configuration-block:: .. code-block:: yaml # config/services.yaml services: # ... App\Command\SunshineCommand: tags: - { name: 'console.command', command: 'app:sunshine' } .. code-block:: xml .. code-block:: php // config/services.php use App\Command\SunshineCommand; // ... $container->register(SunshineCommand::class) ->addTag('console.command', ['command' => 'app:sunshine']) ; .. note:: If the command defines aliases (using the :method:`Symfony\\Component\\Console\\Command\\Command::getAliases` method) you must add one ``console.command`` tag per alias. That's it. One way or another, the ``SunshineCommand`` will be instantiated only when the ``app:sunshine`` command is actually called. .. note:: You don't need to call ``setName()`` for configuring the command when it is lazy. .. caution:: Calling the ``list`` command will instantiate all commands, including lazy commands.