[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管理
- 請求環境
- 返回響應
- 安全
- 加密/解密
- 安全
- 國際化
- 國際化
- 多語言支持