在 Symfony 7.4 中创建自定义 Console 命令需满足:文件置于 src/Command/ 目录下,类名以 Command 结尾、命名空间为 App\Command、继承 Command 类;必须重写 configure()(设名称、描述、参数/选项)和 execute()(返回 int,用 $output->writeln() 输出);参数与选项须先声明后读取。

在 Symfony 7.4 中创建自定义 Console 命令,核心是让类“被自动发现”——只要放对位置、起对名字、写对方法,命令就会直接出现在 php bin/console 列表里,无需手动注册。
命令文件必须放在 src/Command/ 目录下
这是自动发现机制的硬性前提。路径错一个字母都不行:
- ✅ 正确:src/Command/BackupUsersCommand.php
- ❌ 错误:src/Console/BackupUsersCommand.php(目录名不是 Command)
- ❌ 错误:src/Command/backupuserscommand.php(文件名大小写不匹配类名)
- ❌ 错误:src/Command/BackupUsers.php(类名没以 Command 结尾)
类名和命名空间要严格规范
类必须满足三点:
- 命名空间为
App\Command - 类名以
Command结尾,如SendNewsletterCommand、ClearCacheCommand - 必须继承
Symfony\Component\Console\Command\Command
不满足任意一条,命令就不会加载。Symfony 7.4 不再接受旧式 ContainerAwareCommand,也不支持无命名空间或错误命名空间的类。
configure() 和 execute() 是两个必重写的方法
缺一不可,签名和用途固定:
-
configure()中必须调用$this->setName('app:clear-logs')(名称小写、用冒号分组、不含空格),可选加setDescription()、addArgument()、addOption() -
execute(InputInterface $input, OutputInterface $output): int是执行入口;返回0表示成功,非零值(如1)表示失败 - 输出必须用
$output->writeln()或SymfonyStyle,不能用echo或var_dump
参数和选项要先声明、再读取
Symfony 强制校验输入结构,未声明就调用会直接报错:
- 在
configure()中声明参数:$this->addArgument('days', InputArgument::OPTIONAL, '保留多少天日志', 7) - 声明选项:
$this->addOption('force', 'f', InputOption::VALUE_NONE, '跳过确认提示') - 在
execute()中安全读取:$days = $input->getArgument('days');、$force = $input->getOption('force') === true; - 注意:布尔选项默认是
null,判断时别用!$input->getOption('force')
命令定义完成后,运行 php bin/console 就能看到新命令;执行时参数含空格需加引号,例如 php bin/console app:ban-user "John Doe"。


















