Как определять команды, как сервисы

Если вы используете конфигурацию services.yml по умолчанию, то ваши классы команд уже зарегистрированы как сервисы. Отлично! Это рекомендованная установка, но не обязательная. Symfony также смотрит в каталоге``Command/`` каждого пакета, и автоматически регистрирует эти классы, как команды.

Note

Вы также можете вручную зарегистрировать вашу команду, как сервис, сконфигурировав сервис и тегировав его с помощью console.command.

В любом случае, если ваш класс расширяет ContainerAwareCommand, то вы можете получить доступ к публичным сервисам через $this->getContainer()->get('SERVICE_ID').

Но если ваш класс зарегистрирован, как сервис, вы можете вместо этого получить доступ к сервисам, используя нормальное внедрение зависимости.

Например, представьте, что вы хотите записать лог чего-либо изнутри вашей команды:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
namespace AppBundle\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
{
    private $logger;

    public function __construct(LoggerInterface $logger)
    {
        $this->logger = $logger;

        // вы *должны* вызвать родительский конструктор
        parent::__construct();
    }

    protected function configure()
    {
        $this
            ->setName('app:sunshine')
            ->setDescription('Good morning!');
    }

    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->logger->info('Waking up the sun');
        // ...
    }
}

Если вы используете конфигурацию services.yml по умолчанию, то класс команды автоматически будет зарегистрирован, как сервис, и передан аргументу $logger (благодаря автомонтированию). Другими словами, просто создав этот класс, всё работает! Вы можете вызвать команду app:sunshine и начать вести запись логов.

Caution

У вас есть достут к серверам configure(). Однако, попробуйте избегать любой работы (например, запросы в БД), так как этот код будет выполнен, даже если вы используете консоль для выполнения другой комнады.

Эта документация является переводом официальной документации Symfony и предоставляется по свободной лицензии CC BY-SA 3.0.