自定義 CLI 命令?
使用 CLI 命令和使用路由等其他模塊一樣的輕松愉快,也有一些不同的地方,這就是 CLI 命令的由來。CLI 命令是不需要為其定義路由的簡單類,可以讓開發(fā)人員更簡單的創(chuàng)建一些工具。例如,數(shù)據(jù)庫遷移、數(shù)據(jù)庫填充、檢查計劃任務(cronjob)狀態(tài),甚至為公司做一個自定義代碼生成器。
運行命令?
命令是在項目根目錄中通過命令行來執(zhí)行的。在 /app 和 /system 同級目錄中,提供了一個自定義腳本 spark 用于運行任何 CLI 命令:
> php spark
在不指定命令名稱的情況下調用命令,會顯示幫助頁面并展示出所有可用的命令。你應該將命令名稱作為運行該命令的第一個參數(shù)傳遞:
> php spark migrate
一些命令需要使用到更多的參數(shù),你需要直接寫在后面并以空格分隔開:
> php spark db:seed DevUserSeeder
對于 CodeIgniter 提供的命令,如果不提供必需的參數(shù),則將提示你輸入正確運行所需的參數(shù):
> php spark migrate:version
> Version?
創(chuàng)建新的命令?
你可以非常容易的創(chuàng)建新的命令,并在開發(fā)中使用。每個類都必須獨立成一個文件,且必須繼承自 CodeIgniter\CLI\BaseCommand
,同時需要實現(xiàn) run()
方法。
為了在 CLI 命令中列出你的命令并添加相應幫助功能,需要使用到以下屬性:
- ($group): 一個字符串,用于描述列出命令時命令所屬的組。例如(數(shù)據(jù)庫)
- ($name): 表示命令名稱的字符串。例如(migrate:create)
- ($description): 描述命令的字符串。例如(創(chuàng)建一個新的遷移文件)
- ($usage): 描述命令用法的字符串。例如(migrate:create [migration_name] [選項])
- ($arguments): 描述每個命令參數(shù)的字符串數(shù)組。例如(’migration_name’ => ‘遷移文件名’)
- ($options): 描述每個命令選項的字符串數(shù)組。例如(’-n’ => ‘設置遷移命名空間’)
幫助描述將根據(jù)以上參數(shù)自動生成。
文件位置?
命令必須放在名為 Commands 的目錄中。但是,該目錄可以位于 自動加載器 可以找到的任何位置。該目錄可以在 /app/Commands 中,或者一個你用來放置所有命令的目錄,例如 Acme/Commands 。
注解
執(zhí)行命令時,將加載完整的 CodeIgniter CLI 環(huán)境,從而可以獲取環(huán)境信息,路徑信息以及編寫控制器時所用到的任何工具。
命令示例?
讓我們逐步通過一個示例命令來演示,這個命令的功能是報告關于應用程序自身的一些基本信息。首先創(chuàng)建一個 /app/Commands/AppInfo.php 文件,代碼如下:
<?php namespace App\Commands;
use CodeIgniter\CLI\BaseCommand;
use CodeIgniter\CLI\CLI;
class AppInfo extends BaseCommand
{
protected $group = 'demo';
protected $name = 'app:info';
protected $description = '顯示基本應用信息';
public function run(array $params)
{
}
}
如果運行 list 命令,你將在其自己的 demo
組下看到新命令。如果你仔細觀察,就會很容易的發(fā)現(xiàn)它們是如何工作的。$group
屬性說明他所在的組,及存在的所有命令,并會指出他在哪個列表之下。
$name
屬性是命令用來被調用的名字,僅有的要求是不能包含空格,并且所有字符必須是命令行有效字符。按照慣例命令行都是小寫,通過使用命名空間的冒號,可以規(guī)避掉重名的風險。
最后一個屬性 $description
是在 list 命令中顯示的一條描述信息,用來描述命令的用途。
run()?
run()
方法在命令運行時會被調用,$params
數(shù)組是緊跟在命令名之后的 CLI 參數(shù)列表,例如下面的 CLI 內容:
> php spark foo bar baz
foo 是命令名稱,$params
數(shù)組將是:
$params = ['bar', 'baz'];
This can also be accessed through the CLI library, but this already has your command removed from the string. These parameters can be used to customize how your scripts behave.
在我們的 demo 命令中,run
方法類似如下寫法:
public function run(array $params)
{
CLI::write('PHP Version: '. CLI::color(phpversion(), 'yellow'));
CLI::write('CI Version: '. CLI::color(CodeIgniter::CI_VERSION, 'yellow'));
CLI::write('APPPATH: '. CLI::color(APPPATH, 'yellow'));
CLI::write('SYSTEMPATH: '. CLI::color(SYSTEMPATH, 'yellow'));
CLI::write('ROOTPATH: '. CLI::color(ROOTPATH, 'yellow'));
CLI::write('Included files: '. CLI::color(count(get_included_files()), 'yellow'));
}
BaseCommand?
所有命令必須繼承自 BaseCommand
類,它擁有一些很有用的方法,在創(chuàng)建自己的命令時應熟悉這些方法。在 $this->logger 上也有一個 Logger 。
-
CodeIgniter\CLI\BaseCommand
-
call
(string $command[, array $params=[]])? 參數(shù): - $command (string) – 要調用的另一個命令的名稱。
- $params (array) – 使該命令可用的附加 CLI 參數(shù)。
此方法使你可以在當前命令執(zhí)行期間運行其他命令:
$this->call('command_one'); $this->call('command_two', $params);
-
showError
(Exception $e)? 參數(shù): - $e (Exception) – 用于錯誤報告的 Exception。
一種方便的方法,用于向 CLI 保持一致且清晰的錯誤輸出:
try { . . . } catch (\Exception $e) { $this->showError($e); }
-
showHelp
()? 顯示命令幫助的方法:(用法,參數(shù),描述,選項)
-
getPad
($array, $pad)? 參數(shù): - $array (array) – $key => $value 數(shù)組
- $pad (integer) – 填充空格數(shù)
一個為 $key => $value 數(shù)組輸出計算填充的方法。填充可用于在 CLI 中輸出格式化的表格:
$pad = $this->getPad($this->options, 6); foreach ($this->options as $option => $description) { CLI::write($tab . CLI::color(str_pad($option, $pad), 'green') . $description, 'yellow'); } // 輸出應該會像這樣 -n 設置遷移命名空間 -r 覆蓋文件
-