對於laravel初學者來說,對laravel創建自訂Artisan控制台命令可能是不太了解,接下來的這篇文章給大家分享一下laravel框架中創建自訂Artisan控制台命令的實例。
1、入門
Laravel透過Artisan提供了強大的控制台命令來處理非瀏覽器業務邏輯。要查看Laravel中所有的Artisan命令,可以透過在專案根目錄運行:
php artisan list
對應輸出如下(部分截圖):
其中一些命名我們已經比較熟悉了,例如創建遷移make:migration以及執行遷移migrate,又例如創建模型make:model,創建控制器make:controller等。
如果要查看具體某個命令的使用方法,例如我們要查看創建Artisan命令make:console的具體用法,可以使用如下命令:
php artisan help make:console
對應輸出如下:
2、建立指令
Artisan除了提供豐富的控制台指令之外,還允許我們透過make:console指令建立自己的控制台命令。上面我們已經使用help指令查看了make:console的用法,下面我們就沿著這條路走下去,一探究竟:建立指令並運行起來得到我們想要的各種結果。
首先我們建立一個最簡單的指令,印出Hello LaravelAcademy,使用Artisan指令如下:
php artisan make:console HelloLaravelAcademy --command=laravel:academy
其中HelloLaravelAcademy是指令名,laravel:academy是控制台執行的指令,類似make: console。
執行完成後,會在app/Console/Commands目錄下產生一個HelloLaravelAcademy.php檔案:
<?php namespace App\Console\Commands; use Illuminate\Console\Command; class HelloLaravelAcademy extends Command { /** * The name and signature of the console command. * * @var string */ protected $signature = 'laravel:academy'; /** * The console command description. * * @var string */ protected $description = 'Command description.'; /** * Create a new command instance. * * @return void */ public function __construct() { parent::__construct(); } /** * Execute the console command. * * @return mixed */ public function handle() { // } }
其中$signature即為在控制台執行的指令名,$description為指令描述,handle方法為執行指令時所呼叫的方法。
接下來我們簡單寫handle方法如下:
public function handle() { echo "Hello LaravelAcademy\n"; }
好了,一個最簡單的命令已經編寫好了,接下來要怎麼執行並在控制台打印出“Hello LaravelAcademy”呢?
3、執行指令
在執行指令前需要將其註冊到App\Console\Kernel的$commands屬性中:
protected $commands = [ ... //其他命令类 \App\Console\Commands\HelloLaravelAcademy::class ];
接下來我們就可以在控制台運行如下Artisan命令:
php artisan laravel:academy
終端就會印出:
Hello LaravelAcademy
是不是很簡單?
4、更多樣的輸入輸出
當然,上面是最簡單的情形,沒有輸入,寫死的輸出。實際環境中有更複雜的需求,有更多樣的輸入輸出,下面我們來一一討論。
定義輸入
上面已經提到,我們可以透過修改$signature屬性定義輸入參數及選項,例如這裡我們將上述Hello後面的字串調整為透過輸入參數來控制,可修改$signature如下:
protected $signature = 'laravel:academy {name}';
這樣定義意味著name是必選參數,當然也支援更多自訂參數輸入:
{name?} //可选参数 {name=LaravelAcademy} //默认name值为LaravelAcademy
為增強程式健壯性,我們將name修改為有預設值:
protected $signature = 'laravel:academy {name=LaravelAcademy}';
有時候我們還會在執行指令時傳入一些選項,例如是否顯示標點符號(雖然聽上去很雞肋,這裡權當測試之用), 那我們可以修改$signature屬性如下:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark}';
如果呼叫指令時傳遞--mark則代表其值為true,否則為false,如果選項值在輸入時透過使用者設置,可定義$ signature如下:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark=}';
這樣使用者就可以在傳入選項時透過=來為選項賦值,當然和參數一樣,我們也可以為選項指定預設值:
protected $signature = 'laravel:academy {name=LaravelAcademy} {--mark=!}';
#取得輸入
定義好輸入參數與選項後,又該如何取得對應值? Laravel為我們提供了相應的方法。
取得參數值可以透過Illuminate\Console\Command的argument方法:
$name = $this->argument('name');
如果無參考呼叫argument方法,則傳回的是所有參數值陣列。
取得選項值可以透過Illuminate\Console\Command的option方法:
$mark = $this->option('mark');
同理,無參考呼叫option方法會傳回所有選項值陣列。
這樣我們可以修改HelloLaravelAcademy的handle方法如下:
public function handle() { $name = $this->argument('name'); $mark = $this->option('mark'); $string = 'Hello '.$name; if($mark) $string .= $mark; echo $string."\n"; }
這樣我們在控制台輸入如下Artisan指令:
php artisan laravel:academy
對應輸出為:
Hello LaravelAcademy!
再運行如下Artisan指令:
php artisan laravel:academy Laravel --mark=?
對應輸出為:
Hello Laravel?
#輸入提示
我們甚至可以完全讓使用者通過在控制台輸入name來取得輸入參數,先修改handle方法如下:
public function handle() { $name = $this->ask('What do you want to say Hello?'); echo "Hello ".$name."\n"; }
然後在終端機輸入php artisan laravel:academy,互動頁面如下:
如果是輸入密碼一類的敏感資訊可以用secret取代ask方法。
有時候我們會依照使用者的意願選擇繼續或中止:
public function handle() { if($this->confirm('Do you want to continue?[y|n]')){ $this->info("Continue"); }else{ $this->error("Interrupt"); } }
對應輸出為:
除了让用户手动输入外,还可以使用anticipate方法实现自动完成功能:
public function handle() { $name = $this->anticipate('What is your name?', ['Laravel', 'Academy']); $this->info($name); }
当然还可以使用choice方法为用户提供选择避免手动输入,用户只需选择对应索引即可:
public function handle() { $name = $this->choice('What is your name?', ['Laravel', 'Academy']); $this->info($name); }
对应交互页面如下:
编写输出
关于输出字符串,上面我们简单使用了echo语句,其实Laravel提供了更为强大和多样化的方法:
public function handle() { $this->info("Successful!"); $this->error("Something Error!"); $this->question("What do you want to do?"); $this->comment("Just Comment it!"); }
执行php artisan laravel:academy对应输出如下:
表格
Artisan甚至可以输出表格:
public function handle() { $headers = ['Name', 'Email']; $users = \App\User::all(['name', 'email'])->toArray(); $this->table($headers, $users); }
执行php artisan laravel:academy对应输出为:
进度条
当然对于复杂耗时的命令,进度条是必不可少的,
public function handle() { $this->output->progressStart(10); for ($i = 0; $i < 10; $i++) { sleep(1); $this->output->progressAdvance(); } $this->output->progressFinish(); }
执行php artisan laravel:academy对应输出为:
5、从CLI之外调用Artisan
除了在控制台执行Artisan命令之外,还可以通过代码在别处调用Artisan命令,比如其它Artisan命令、控制器、路由或其他。
路由
在路由闭包中我们可以通过Artisan门面的call方法来调用本节创建的命令:
//在路由中调用Artisan命令 Route::get('testArtisan',function(){ $exitCode = Artisan::call('laravel:academy', [ 'name' => 'Laravel学院', '--mark' => '!' ]); });
其它Artisan命令
在一个Artisan命令中也可以调用另一个Artisan命令,还是通过call方法:
public function handle() { $this->call('inspire'); }
如果想要调用一个Artisan命令并阻止其所有输出,可以使用callSilent方法:
public function handle() { $this->callSilent('inspire'); }
除此之外,关于Artisan命令你还应该知道的是我们可以在创建的命令类的控制器或方法中注入任何依赖。这就意味着我们可以在命令类中使用注册到服务容器的所有类。
相关推荐:
Laravel框架内置的Broadcast功能如何实现与客户端实时通信
以上是Laravel 5.1框架中如何建立自訂Artisan控制台命令的詳細內容。更多資訊請關注PHP中文網其他相關文章!