Symfony 控制台命令需继承 Command 类,定义 $defaultName 或使用 #[AsCommand] 属性声明命令名,通过 configure() 或属性添加参数与选项,逻辑在 execute() 中用 $input 获取参数、$output 输出结果,最后返回 Command::SUCCESS 或 FAILURE。

写一个 Symfony 控制台命令,核心就三件事:定义命令名和参数、处理输入逻辑、输出结果。不需要复杂配置,也不用碰路由或控制器——它本身就是独立可执行的类。
创建命令类文件
在 src/Command/ 目录下新建 PHP 类,继承 Command,并设置默认命令名:
- 类名必须以
Command结尾(如UserImportCommand) - 用
protected static $defaultName = 'app:import-users';声明命令名 - 如果使用 Symfony 5.4+,推荐改用属性方式:
#[AsCommand(name: 'app:import-users')],同时删掉configure()方法
声明参数和选项
在 configure() 方法(或 #[AsCommand] 属性中)定义用户能传什么:
- 位置参数(必填/可选):
$this->addArgument('file', InputArgument::REQUIRED, 'CSV 文件路径') - 选项参数(带
--或短格式-f):$this->addOption('limit', 'l', InputOption::VALUE_REQUIRED, '最多导入多少条', 100) - 布尔开关(无需值):
$this->addOption('dry-run', null, InputOption::VALUE_NONE, '只校验不写入')
注意:参数名(如 'file')必须和后面 $input->getArgument('file') 中的一致,大小写敏感。
在 execute() 里读取和响应
所有实际逻辑必须写在 execute(InputInterface $input, OutputInterface $output) 中:
- 取参数:
$filePath = $input->getArgument('file');;取选项:$limit = $input->getOption('limit'); - 检查是否传了某选项:
if ($input->hasOption('dry-run') && $input->getOption('dry-run')) { ... } - 输出文本:
$output->writeln('<info>✅ 导入完成</info>');(支持颜色和格式) - 报错退出:
return Command::FAILURE;(返回非 0 状态码)
别在构造函数里存 $input 或 $output,它们每次执行都是新对象,保存会导致行为异常。
运行与调试
命令写完后,终端直接运行:
-
php bin/console list查看所有可用命令 -
php bin/console app:import-users users.csv --limit=50 --dry-run执行带参数的命令 -
php bin/console app:import-users -h查看自动生成的帮助信息
如果中文乱码,先确认终端编码是 UTF-8(Windows 可运行 chcp 65001),避免混用 echo 和 $output->writeln()。


















