Symfony自定义命令需满足三点:类文件置于src/Command/目录下,类名以Command结尾且命名空间为App\Command,必须重写configure()和execute()方法;configure()中设命令名、描述及参数选项,execute()中读取并处理输入,返回整数状态码。

在 Symfony 项目中创建自定义命令行工具,核心就三点:放对位置、起对名字、写对方法。只要满足这些硬性要求,命令就能自动出现在 php bin/console 列表里,无需额外注册(Symfony 5.4+ 默认启用自动发现)。
命令类必须放在 src/Command/ 目录下
这是自动发现机制的首要条件。文件路径必须是:
-
src/Command/GreetCommand.php✅ -
src/Console/GreetCommand.php❌(目录名错) -
src/Commands/GreetCommand.php❌(少个 s 不影响语法,但破坏自动发现) -
src/Command/greetcommand.php❌(类名大小写敏感,且文件名需与类名一致)
类名必须以 Command 结尾,且命名空间为 App\Command
类定义要严格符合规范:
- 命名空间声明为
namespace App\Command; - 类名如
GreetCommand、BackupUsersCommand,不能是GreetConsole或Greet - 必须继承
Symfony\Component\Console\Command\Command
configure() 和 execute() 是唯二必须重写的方法
这两个方法缺一不可,签名和用途有明确约定:
-
configure()中必须调用$this->setName('app:greet')(名称不含空格,推荐冒号分组),并可选调用setDescription()、addArgument()、addOption() -
execute(InputInterface $input, OutputInterface $output): int是执行入口,返回0表示成功,非0(如1)表示失败 - 输出必须用
$output->writeln('Hello!'),不能用echo;否则颜色、测试、格式化全失效
参数和选项要先声明再读取
Symfony 强制校验输入结构,未声明就调用会直接报错:
- 在
configure()中声明参数:$this->addArgument('name', InputArgument::REQUIRED, 'Who to greet?') - 声明选项:
$this->addOption('yell', 'y', InputOption::VALUE_NONE, 'Yell the greeting') - 在
execute()中安全读取:$input->getArgument('name')和$input->getOption('yell') - 参数按顺序绑定、不可省略(除非设为
InputArgument::OPTIONAL);选项带--前缀、全可选、支持缩写(如-y)


















