引言
上一章我教會大家如何在3分鐘的時間腮猖,通過laravel躋身geek之列(聽一下就好[捂嘴.jpg])。實(shí)現(xiàn)了一個簡單的命令行赞枕,和一個復(fù)雜的發(fā)送郵件通知的功能澈缺。
可是細(xì)心的讀者你發(fā)現(xiàn)了沒有,使用自定義的命令行炕婶,全程我們沒有輸入一個參數(shù)姐赡,沒有一個數(shù)據(jù),這柠掂,這项滑,這,太不尋常了吧涯贞!
linux下的命令枪狂,沒有一個是不帶參數(shù)自己玩兒的!所以本文教你改造命令行宋渔,做一個標(biāo)準(zhǔn)的應(yīng)用程序州疾。
事前詢問
首先我們要區(qū)分獲取參數(shù)的兩種方式,一種是在輸入命令行時直接給定的傻谁,還有一種是在程序運(yùn)行過程中孝治,等待用戶輸入信息之后才能繼續(xù)列粪。
先說第一種方式审磁,也分為兩種,一種叫參數(shù) argument岂座,一種叫選項(xiàng) option态蒂。在laravel程序里,這兩個名字沒有變化费什。
比如钾恢,有一個密碼重置的命令行工具,要求傳入一個 userId 用于標(biāo)記用戶的身份鸳址,在類的聲明中指明使用方式:
protected $signature = 'password:reset {userId}';
假設(shè)上述類已經(jīng)完成功能開發(fā)瘩蚪,在命令行中調(diào)用:
php artisan password:reset 5
在代碼中使用 $this->argument() 方法,打印其結(jié)果是一個數(shù)組稿黍,內(nèi)容如下:
[
"command": "password:reset",
"userId': "5",
]
如果要返回指定的參數(shù)值疹瘦,只需傳入鍵名即可:
$this->argument('userId'); // 5
返回的就是命令行上傳送的參數(shù)。這個 {userId} 的寫法就是 argument巡球,稱為 參數(shù)言沐。
還有一種方式是選項(xiàng) option邓嘹,聲明的時候,要在方法內(nèi)這樣寫:
protected $signature = 'password:reset {--userId=}';
這就是聲明一個選項(xiàng)了险胰,使用命令行的時候數(shù)據(jù)傳送方式也不一樣:
php artisan password:reset --userId=5
程序里要用 $this->option() 來獲取汹押,打印數(shù)組內(nèi)容如下:
[
"userId" => "5"
"help" => false
"quiet" => false
"verbose" => false
"version" => false
"ansi" => false
"no-ansi" => false
"no-interaction" => false
"env" => null
]
比 argument 打印的內(nèi)容豐富的多,為什么起便?因?yàn)槟切┦耹aravel Command 類默認(rèn)追加上的棚贾,只要繼承了基類都天然自帶這些選項(xiàng)。
用法類似榆综,獲取單個的選項(xiàng)值鸟悴,只要傳入鍵名就可以了:
$this->option('userId');
為了演示兩個方法的用法,我們?yōu)槊钚姓{(diào)用方式聲明兩種獲取參數(shù)的方式:
protected $signature = 'password:reset {userId : user ID} {--sendEmail : Send email or NOT}';
在程序里我們要分別獲取奖年,下面是手動實(shí)現(xiàn) handle 處理方法:
public function handle()
{
// 所有參數(shù)
$arguments = $this->argument();
$userid = $this->argument('userId');
// 所有選項(xiàng)
$options = $this->option();
$sendEmail = $this->option('sendEmail');
}
事中確認(rèn)
有些參數(shù)是要在程序運(yùn)行中對用戶進(jìn)行詢問细诸,下面就介紹幾個常用的方法。
ask方法需要用戶輸入字符串內(nèi)容:
$email = $this->ask('What is your email address?');
如果輸入的是密碼敏感數(shù)據(jù)陋守,默認(rèn)是不能展示在終端的震贵,使用 secret方法:
$password = $this->secret('What is the password?');
有時候是詢問用戶是或者否,那就用 confirm方法:
if ($this->confirm('Do you want to reset the password?')) {
//
}
還有一些水评,盡量減少用戶輸入猩系,使用選項(xiàng)的方式,讓用戶選中燥,這樣輸入的采集數(shù)據(jù)基本不會出錯寇甸。使用 choice方法:
$level = $this->choice('What is the level?', ['low', 'middle', 'high'], 0);
有這幾個助陣,基本上夠用了疗涉,做一個有些復(fù)雜的中型的命令行工具拿霉,只要PHP還運(yùn)行的動,處理的來咱扣,基本沒啥問題绽淘。
寫在最后
本文我們講述了兩個重要的概念,參數(shù)和選項(xiàng)闹伪。在設(shè)計(jì)命令行的時候一定要想清楚沪铭,規(guī)劃好,到底用哪一個偏瓤,在代碼中才能有的放矢地讀取杀怠。并且使用詢問等待可以制作更多靈活的引導(dǎo)型程序,非常實(shí)用厅克。
Happy coding :-)
我是@程序員小助手赔退,專注編程知識,圈子動態(tài)的IT領(lǐng)域原創(chuàng)作者