Як визначати команди, як сервіси
Дата оновлення перекладу 2025-08-21
Як визначати команди, як сервіси
Якщо ви використовуєте конфігурацію services.yaml за замовчуванням , то ваші класи команд вже зареєстровані як сервіси. Чудово! Це рекомендована установка.
Note
Ви також можете вручну зарєструквати вашу команду як сервіс, сконфігурувавши сервіс
та тегувавши його за допомогою console.command.
Наприклад, уявіть, що ви хочете записати лог будь-чого зсередини вашої команди:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
namespace App\Command;
use Psr\Log\LoggerInterface;
use Symfony\Component\Console\Attribute\AsCommand;
#[AsCommand(name: 'app:sunshine', description: 'Good morning!')]
class SunshineCommand
{
public function __construct(
private LoggerInterface $logger,
) {
}
public function __invoke(): int
{
$this->logger->info('Waking up the sun');
// ...
return Command::SUCCESS;
}
}
Якщо ви використовуєте конфігурацію services.yaml за замовчуванням ,
то клас команди автоматично буде зареєстровано як сервіс і передано аргументу $logger
(завдяки автомонтуванню). Іншими словами, просто створивши цей клас - все працює! Ви
можете викликати команду app:sunshine і почати вести запис логів.
Warning
У вас є доступ до сервісів configure(). Однак, якщо ваша команда не
лінива , спробуйте уникати будь-якої
роботи (наприклад, запити у БД), так як цей код буде виконано, навіть якщо ви
використовуєте консоль для виконання іншої команди.
Ліниве завантаження
Щоб зробити вашу команду ліниво завантажуваною, або визнчте її імʼя, використовуючи
PHP-атрибут AsCommand:
1 2 3 4 5 6 7 8
use Symfony\Component\Console\Attribute\AsCommand;
// ...
#[AsCommand(name: 'app:sunshine')]
class SunshineCommand
{
// ...
}
Або встановіть атрибут command у тегу console.command у вашому визначенні сервісу:
1 2 3 4 5 6 7
# config/services.yaml
services:
# ...
App\Command\SunshineCommand:
tags:
- { name: 'console.command', command: 'app:sunshine' }
Note
Якщо команда визначає псевдоніми (використовуючи метод
getAliases()),
ви повинні додати по одному тегу console.command на псевдонім.
Ось і все. Так чи інакше, SunshineCommand буде інстаційована лише тоді, коли команда
app:sunshine буде дійсно викликана.
Note
Вам не потрібно викликати setName() для конфігурації команди, якщо вона лінива.
Warning
Виклик команди list призведе до інстанціювання усіх команд, включно з лінивими
командами. Однак, якщо команда - це Symfony,
то базову фабрику команд не буде виконано.