webman自定义命令必须通过./webman make:command生成骨架类,因直接执行php脚本会跳过support/bootstrap.php,导致di容器、配置、数据库等未初始化;static $defaultname须为字符串字面量,否则./webman list无法识别。

Webman 的自定义命令必须走 webman/console 插件机制,否则 config()、Db::table()、Log::info() 全部不可用——这不是权限或路径问题,是框架生命周期没启动。
为什么直接 php script.php 会报 Call to a member function get() on null
裸跑 PHP 脚本跳过了 support/bootstrap.php,而它负责初始化 DI 容器、加载配置、注册数据库连接器。即使你手动 require_once 了 autoload 和 bootstrap,bootstrap.php 本身又依赖 start.php 中的上下文(如 Container::set() 调用顺序),所以大概率仍失败。
-
config('database')返回null -
Db::table('users')报Call to a member function table() on null -
Container::get('logger')报Call to a member function get() on null - 所有依赖容器注入的类(包括中间件、模型、日志)都无法使用
如何正确创建一个可用的命令类
用 ./webman make:command 生成骨架,而不是手写文件或复制粘贴。生成后只需改 handle()(新版已统一为 execute())方法即可直接使用框架能力。
- 执行
./webman make:command db:backup→ 生成app/command/DbBackupCommand.php -
static $defaultName必须是字符串字面量,例如'db:backup',不能写成'db:' . 'backup',否则./webman list不识别 - 类必须继承
Symfony\Component\Console\Command\Command -
execute()方法内可直接调用config()、Db::table()、Log::info(),无需任何手动初始化 - 参数获取统一用
$input->getArgument('name')或$input->getOption('force'),别碰$argv
常见命令参数与输出控制技巧
Symfony Console 提供了结构化输出和参数解析能力,不用自己 parse $argv 或拼接字符串。
- 定义必选参数:
$this->addArgument('table', InputArgument::REQUIRED, '表名') - 定义带默认值的选项:
$this->addOption('limit', 'l', InputOption::VALUE_REQUIRED, '限制条数', 100) - 输出带颜色文本:
$output->writeln('<info>✅ 备份完成</info>') - 输出表格:
(new Table($output))->setHeaders(['id', 'name'])->addRow([1, 'admin'])->render() - 返回退出码控制脚本流:
return self::SUCCESS或return self::FAILURE
运行时找不到命令或提示 command not found
不是命令写错了,而是当前不在 Webman 项目根目录,或 webman 脚本权限/内容异常。
- 先确认是否在项目根目录:执行
ls -F | grep '/\|start\.php',应同时看到start.php和config/目录 - 检查
webman文件是否存在且可执行:ls -l webman,若无x权限,运行chmod +x webman - 首行必须是
#!/usr/bin/env php,可用head -n 1 webman验证 - 若仍失败,改用
php webman db:backup绕过 shebang,排除系统解析问题 - 若报
Class 'Webman\Console' not found,说明vendor/autoload.php未加载,执行composer install --no-dev
最易被忽略的一点:命令类里的 static $defaultName 看似只是个字符串,但它被 webman/console 的命令发现机制硬编码匹配——拼接、变量、常量引用全都不认,必须是纯字面量。这个细节一旦出错,命令就彻底“隐身”。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











