创建控制器文件:在commands/目录下新建如hellocontroller.php的文件;2. 编写控制器代码:定义继承自yii\console\controller的类,并在其中创建以action开头的方法作为命令动作,使用stdout输出信息,返回exitcode常量表示执行结果,通过options()方法定义选项;3. 运行命令:在终端执行php yii <控制器id>/<动作id> [参数] [--选项],例如php yii hello/greet john或php yii hello/process --force=1 --env=prod。完整流程允许通过位置参数和选项灵活传递数据,结合prompt、confirm实现交互,配合日志、错误码、环境配置和定时任务使用,可构建健壮的后台自动化脚本。

Yii框架的CLI命令,说白了,就是让你能在命令行里直接跑Yii应用逻辑的一种方式。它通过一个入口脚本(通常是根目录下的
yii
yii.bat
yii\console\Controller
要在Yii框架中创建控制台命令,你需要在项目的
commands
具体步骤如下:
创建控制器文件: 在
commands/
HelloController.php
编写控制器代码: 在
HelloController.php
yii\console\Controller
action
action
<?php
namespace app\commands;
use yii\console\Controller;
use yii\console\ExitCode;
/**
* HelloController 演示如何创建和使用控制台命令。
*/
class HelloController extends Controller
{
/**
* 这是一个默认动作,当只输入 `php yii hello` 时执行。
*
* @param string $message 要显示的消息,默认是 "Hello World!"
* @return int Exit code
*/
public function actionIndex($message = 'Hello World!')
{
$this->stdout($message . "\n"); // 使用 stdout 输出到控制台
return ExitCode::OK; // 返回成功的退出码
}
/**
* 一个带参数的动作示例。
*
* @param string $name 问候的对象名称
* @return int Exit code
*/
public function actionGreet($name)
{
$this->stdout("你好, " . $name . "!\n");
return ExitCode::OK;
}
/**
* 一个带可选参数和选项的动作示例。
*
* @param bool $force 是否强制执行
* @param string $env 运行环境
* @return int Exit code
*/
public function actionProcess($force = false, $env = 'dev')
{
if ($force) {
$this->stdout("强制模式已启用。\n");
}
$this->stdout("当前环境: " . $env . "\n");
$this->stdout("正在处理一些任务...\n");
return ExitCode::OK;
}
/**
* 定义选项。
* 可以在这里为动作方法定义别名或默认值。
* 比如,为 actionProcess 定义 --force 和 --env 选项。
*/
public function options($actionID)
{
return array_merge(parent::options($actionID), [
'force', // 对应 actionProcess 的 $force 参数
'env', // 对应 actionProcess 的 $env 参数
]);
}
}运行命令: 打开你的终端或命令行工具,进入到Yii项目的根目录,然后执行:
php yii hello
HelloController
actionIndex
php yii hello/index "自定义消息"
actionIndex
php yii hello/greet John
actionGreet
John
php yii hello/process --force=1 --env=prod
actionProcess
通过这种方式,你可以把各种复杂的逻辑封装成独立的命令行工具,非常方便。我个人觉得,当你需要跑一些耗时任务,或者需要自动化部署、数据清洗的时候,CLI命令简直是救星。
Yii的CLI命令遵循一套相当直观的命名约定,一旦你掌握了,就能很快地定位和创建命令。
控制器命名: 你的控制台控制器文件通常放在
commands/
HelloController.php
hello
HelloController
hello
动作命名: 控制器类中的公共方法,如果以
action
actionIndex()
index
actionGreet()
greet
actionIndex
命令结构: 完整的命令通常是
php yii <控制器ID>/<动作ID> [参数] [--选项]
<控制器ID>
Controller.php
<动作ID>
action
action
模块内的命令: 如果你的应用使用了模块,并且想在模块内部定义CLI命令,你可以把它们放在模块的
commands/
blog
modules/blog/commands/PostController.php
php yii blog/post/create
处理参数和选项是CLI命令的核心功能之一,它让你的命令变得灵活多变,能够根据不同的输入执行不同的逻辑。Yii在这方面做得相当不错。
位置参数 (Positional Arguments): 这些参数是按照它们在命令中出现的顺序传递的。在你的
action
public function actionCreateUser($username, $email)
{
$this->stdout("创建用户: " . $username . ", 邮箱: " . $email . "\n");
}执行:
php yii user/create-user john john@example.com
public function actionDownload($url, $path = './downloads')
{
$this->stdout("下载 " . $url . " 到 " . $path . "\n");
}执行:
php yii file/download http://example.com/file.zip
php yii file/download http://example.com/file.zip /var/tmp
选项 (Options): 选项通常以双连字符
--
作为Action方法的参数: 最常见且推荐的方式。
public function actionProcessData($dryRun = false, $batchSize = 100)
{
if ($dryRun) {
$this->stdout("正在以空运行模式处理数据。\n");
}
$this->stdout("批处理大小: " . $batchSize . "\n");
}执行:
php yii data/process-data --dry-run=1 --batch-size=50
--dry-run=1
$dryRun = true
--batch-size=50
$batchSize = 50
1
true
on
true
通过options()
options()
class MyController extends Controller
{
public $verbose = false; // 定义一个公共属性作为选项
public function options($actionID)
{
// 返回当前动作可用的选项列表
return ['verbose']; // 对应 --verbose
}
public function actionDoSomething()
{
if ($this->verbose) {
$this->stdout("详细模式已启用。\n");
}
$this->stdout("正在做一些事情...\n");
}
}执行:
php yii my/do-something --verbose
交互式输入与输出: 在CLI命令中,你经常需要与用户进行交互,比如提示用户输入、确认操作。Yii提供了一些方便的方法:
$this->stdout($string)
$this->stderr($string)
$this->prompt($text, $options = [])
$this->confirm($message, $default = false)
public function actionDeleteData()
{
if ($this->confirm('确定要删除所有数据吗?这不可逆!')) {
$this->stdout("数据已删除。\n");
} else {
$this->stdout("操作已取消。\n");
}
}这些工具让CLI命令的交互性大大增强,尤其是在执行一些高风险操作前,加一个确认步骤是必不可少的。
在实际开发中,CLI命令虽然方便,但也有些地方需要注意,以及一些小技巧能让你的工作更顺畅。
环境配置: CLI命令默认运行在
console
console/config/main.php
console/config/params.php
日志记录: CLI命令通常是无人值守运行的,因此良好的日志记录至关重要。Yii的日志组件在CLI环境下同样可用。你可以配置日志目标,将CLI命令的输出、错误和调试信息记录到文件中,而不是仅仅打印到控制台。这样,即使命令跑出问题,你也能通过日志文件追溯原因。
定时任务 (Cron Jobs): 许多CLI命令都是设计来作为定时任务运行的。在Linux系统上,你可以使用
crontab
0 3 * * * /usr/bin/php /path/to/your/yii/app/yii data/cleanup > /var/log/myapp_cleanup.log 2>&1
php
内存与执行时间限制: CLI脚本通常处理大量数据或执行耗时操作,可能会遇到PHP的内存限制(
memory_limit
max_execution_time
ini_set()
php.ini
错误处理与退出码: CLI命令应该返回一个退出码(Exit Code),通常
0
0
yii\console\ExitCode
ExitCode::OK
ExitCode::UNSPECIFIED_ERROR
依赖注入与服务定位器: 在CLI命令中,你可以像在Web应用中一样,通过
Yii::$app->componentName
安全性: 虽然CLI命令通常只在服务器上由受信任的用户或系统执行,但仍然需要注意安全。避免在CLI命令中硬编码敏感信息,并确保只有授权用户才能执行关键命令。例如,一个删除数据的命令,最好加上确认提示或者只允许特定环境执行。
这些细节和技巧,是我在实际开发中慢慢摸索出来的,它们能帮助你写出更健壮、更易于维护的Yii CLI命令。
以上就是YII框架的CLI命令是什么?YII框架如何创建控制台命令?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号