對於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中文網其他相關文章!

Laravel10,releasedonFebruary7,2023,isthelatestversion.Itfeatures:1)Improvederrorhandlingwithanewreportmethodintheexceptionhandler,2)EnhancedsupportforPHP8.1featureslikeenums,and3)AnewLaravel\Promptspackageforinteractivecommand-lineprompts.

thelatestlaravelververversionenhancesdevelopmentwith:1)簡化的inimpliticmodelbinding,2)增強EnhancedeloquentcapabibilitionswithNewqueryMethods和3)改善了supportorfortormodernphpfortornphpforternphpfeatureserslikenamedargenamedArgonedArgonsemandArgoctess,makecodingMoreftermeforefterMealiteFficeAndEnjoyaigaigaigaigaigaiganigaborabilyaboipaigyAndenjoyaigobyabory。

你可以在laravel.com/docs找到最新Laravel版本的發布說明。 1)發布說明提供了新功能、錯誤修復和改進的詳細信息。 2)它們包含示例和解釋,幫助理解新功能的應用。 3)注意新功能的潛在復雜性和向後兼容性問題。 4)定期審查發布說明可以保持更新並激發創新。

theessentialToolSforStayingConnectedIndistributedTeamSinclude:1)CommunicationToolSlikeZoom,Microsoftteams,Slack和DiscordForeFforeffectiveCommunication; 2)ProjectManagementtoolsSuchastrello,Asana,Asana和JirafortaskManagementAngeandWorkFloworGanization jiralagementtoolssuchastrello,Asana和Jiraforterforloganization;

Laravel通過簡化Web開發過程和提供強大功能脫穎而出。其優勢包括:1)簡潔的語法和強大的ORM系統,2)高效的路由和認證系統,3)豐富的第三方庫支持,使得開發者能專注於編寫優雅的代碼並提高開發效率。

laravelispredminandermanthandermanthandermanthandermanthermanderframework,設計Forserver-SideLogic,databasemagement,andapideplupment,thryitalsosupportsfortfortsfrontenddevelopmentwithbladeTemplates。

Laravel和Python在性能和可擴展性方面的表現各有優劣。 Laravel通過異步處理和隊列系統提升性能,但受PHP限制在高並發時可能有瓶頸;Python利用異步框架和強大的庫生態系統表現出色,但在多線程環境下受GIL影響。

Laravel適合團隊熟悉PHP且需功能豐富的項目,Python框架則視項目需求而定。 1.Laravel提供優雅語法和豐富功能,適合需要快速開發和靈活性的項目。 2.Django適合複雜應用,因其“電池包含”理念。 3.Flask適用於快速原型和小型項目,提供極大靈活性。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Dreamweaver CS6
視覺化網頁開發工具