В Symfony команды обычно записываются через ::
php bin/console tenant:users:import customers.csv
➡️ В Symfony 8.2 появился альтернативный синтаксис:
php bin/console tenant users import customers.csv
Оба варианта запускают одну и ту же команду.
Главное отличие — в spaced-синтаксисе каждый уровень может обрабатывать собственные опции:
php bin/console tenant --name=acme users import customers.csv --dry-run
Здесь:
🔘 tenant получает опцию --name;
🔘 users — промежуточный уровень;
🔘 import запускает конечную команду;
🔘 --dry-run передаётся последней команде.
Для доступа к параметрам родительских команд появился CommandChain:
public function __invoke(
CommandChain $chain,
#[Argument] string $file,
): int {
$tenantName = $chain
->getInput('tenant')
?->getOption('name');
// ...
}
Также Symfony 8.2 позволяет описывать целые группы команд в одном классе через #[AsCommand].
📌 Особенно полезно для CLI-приложений с многоуровневой структурой — например, docker compose, git или административных инструментов.
🔗 Читать подробнее
🐸 Библиотека пхпшника
