[TOC]
# 创建命令行(CLI)应用程序
CLI应用程序从命令行执行。它们对于创建定时作业,脚本,命令实用程序等非常有用。
## 结构
CLI应用程序的最小结构如下所示:
* `app/config/config.php`
* `app/tasks/MainTask.php`
* `app/cli.php` 主启动文件
## 创建启动程序
与常规MVC应用程序一样,启动程序文件用于启动应用程序。我们使用`cli.php`文件来启动应用程序,而不是Web应用程序中的`index.php`启动程序。
下面是一个用于此示例的示例启动程序。
```php
<?php
use Phalcon\Di\FactoryDefault\Cli as CliDI;
use Phalcon\Cli\Console as ConsoleApp;
use Phalcon\Loader;
// 使用CLI工厂默认服务容器
$di = new CliDI();
/**
* 注册自动加载器并告诉它注册任务目录
*/
$loader = new Loader();
$loader->registerDirs(
[
__DIR__ . '/tasks',
]
);
$loader->register();
// 加载配置文件(如果有)
$configFile = __DIR__ . '/config/config.php';
if (is_readable($configFile)) {
$config = include $configFile;
$di->set('config', $config);
}
// 创建控制台应用程序
$console = new ConsoleApp();
$console->setDI($di);
/**
* 处理控制台参数
*/
$arguments = [];
foreach ($argv as $k => $arg) {
if ($k === 1) {
$arguments['task'] = $arg;
} elseif ($k === 2) {
$arguments['action'] = $arg;
} elseif ($k >= 3) {
$arguments['params'][] = $arg;
}
}
try {
// 处理传入的参数
$console->handle($arguments);
} catch (\Phalcon\Exception $e) {
// Phalcon在这里做了相关的事情
// ..
fwrite(STDERR, $e->getMessage() . PHP_EOL);
exit(1);
} catch (\Throwable $throwable) {
fwrite(STDERR, $throwable->getMessage() . PHP_EOL);
exit(1);
}
```
这段代码可以使用以下命令运行:
```bash
php app/cli.php
```
## 任务
任务与控制器类似。任何CLI应用程序至少需要一个`MainTask`和一个`mainAction`,并且每个任务都需要有一个`mainAction`,如果没有明确给出任何操作,它将运行。
下面是 `app/tasks/MainTask.php` 文件的示例:
```php
<?php
use Phalcon\Cli\Task;
class MainTask extends Task
{
public function mainAction()
{
echo 'This is the default task and the default action' . PHP_EOL;
}
}
```
## 处理动作参数
可以将参数传递给操作,其代码已经存在于示例启动程序中。
如果使用以下参数和操作运行应用程序:
```php
<?php
use Phalcon\Cli\Task;
class MainTask extends Task
{
public function mainAction()
{
echo 'This is the default task and the default action' . PHP_EOL;
}
/**
* @param array $params
*/
public function testAction(array $params)
{
echo sprintf('hello %s', $params[0]);
echo PHP_EOL;
echo sprintf('best regards, %s', $params[1]);
echo PHP_EOL;
}
}
```
然后我们可以运行以下命令:
```bash
php app/cli.php main test world universe
hello world
best regards, universe
```
## 链式操作运行任务
如果需要,还可以用链式操作运行任务。要实现此目的,您必须将控制台本身添加到DI:
```php
<?php
$di->setShared("console", $console);
try {
// 处理传入的参数
$console->handle($arguments);
} catch (\Phalcon\Exception $e) {
// Phalcon在这里做了相关的事情
// ..
fwrite(STDERR, $e->getMessage() . PHP_EOL);
exit(1);
} catch (\Throwable $throwable) {
fwrite(STDERR, $throwable->getMessage() . PHP_EOL);
exit(1);
}
```
然后你可以在任何任务中使用控制台。下面是修改后的MainTask.php的示例:
```php
<?php
use Phalcon\Cli\Task;
class MainTask extends Task
{
public function mainAction()
{
echo "This is the default task and the default action" . PHP_EOL;
$this->console->handle(
[
"task" => "main",
"action" => "test",
]
);
}
public function testAction()
{
echo "I will get printed too!" . PHP_EOL;
}
}
```
但是,扩展 `Phalcon\Cli\Task` 并在那里实现这种逻辑是一个更好的主意。
- 常规
- Welcome
- 贡献
- 生成回溯
- 测试重现
- 单元测试
- 入门
- 安装
- Web服务器设置
- WAMP
- XAMPP
- 教程
- 基础教程
- 教程:创建一个简单的REST API
- 教程:Vökuró
- 提升性能
- 教程:INVO
- 开发环境
- Phalcon Compose (Docker)
- Nanobox
- Phalcon Box (Vagrant)
- 开发工具
- Phalcon开发者工具的安装
- Phalcon开发者工具的使用
- 调试应用程序
- 核心
- MVC应用
- 微应用
- 创建命令行(CLI)应用程序
- 依赖注入与服务定位
- MVC架构
- 服务
- 使用缓存提高性能
- 读取配置
- 上下文转义
- 类加载器
- 使用命名空间
- 日志
- 队列
- 数据库
- 数据库抽象层
- Phalcon查询语言(PHQL)
- ODM(对象文档映射器)
- 使用模型
- 模型行为
- ORM缓存
- 模型事件
- 模型元数据
- 模型关系
- 模型事务
- 验证模型
- 数据库迁移
- 分页
- 前端
- Assets管理
- 闪存消息
- 表单
- 图像
- 视图助手(标签)
- 使用视图
- Volt:模板引擎
- 业务逻辑
- 访问控制列表(ACL)
- 注解解析器
- 控制器
- 调度控制器
- 事件管理器
- 过滤与清理
- 路由
- 在session中存储数据
- 生成URL和路径
- 验证
- HTTP
- Cookies管理
- 请求环境
- 返回响应
- 安全
- 加密/解密
- 安全
- 国际化
- 国际化
- 多语言支持