引言
習慣了在windows下敲敲點點的同學,習慣了沒有視窗視圖就無從下手的同學,來到linux第一個面臨的問題就是,core發行版根本不提供gui,太費空間,太費資源,要啥視窗?
是以電影裡看到很多懂的,不懂的,懂的裝不懂的,不懂的裝懂的那麼演員們,都在奮力敲擊鍵盤,一串串熒幕輸出像火箭似的飛速狂奔。這大概隻有拷貝檔案,或者debug時才能有的盛舉吧。

沒錯兒,在linux下,你是PC小白也好,是行業大神也罷,都得敲那麼兩下子,這叫——“專業”。
本文給那些想寫個指令行程式,體驗一把geek範的同學一次機會,教你3分鐘内迅速跻身geek之列。
代碼時間
使用腳手架指令生成一個指令行類:
php artisan make:console WelcomeNewUsers --command=email:newusers
該指令在 app/Console/Commands/ 檔案夾下生成一個 WelcomeNewUsers.php 的類,因為使用了 --command 選項,是以類内指定了指令調用的名字。
namespace App\Console\Commands;
use Illuminate\Console\Command;
class WelcomeNewUsers extends Command
{
protected $signature = 'email:newusers';
protected $description = 'Command description';
public function __construct()
{
parent::__construct();
}
public function handle()
{
//
}
}
這就是檔案的原始内容,我們需要實作的邏輯,可以在 handle 方法内任意書寫了。這是實作代碼邏輯的地方,我們先把整個流程的架子搭完,然後再細化代碼。下面該注冊這個指令了,在檔案 app/Console/Kernel.php 檔案内添加下面的配置項:
protected $commands = [
\App\Console\Commands\WelcomeNewUsers::class,
];
建立的指令行類必須在此引入才能夠被 Artisan 正确地調用。
為什麼不用一個 hello world 的示例呢,直接列印出來不是更簡單?當然可以,下面就是在指令行列印 hello world 字元串:
public function handle()
{
$this->output->info('hello world');
}
編輯完畢,儲存檔案後,打開指令行,并進入到項目的根目錄,執行下面的指令:
php artisan email:newusers
如無意外,指令行上就會列印出綠色字型的 hello world了。
示範指令太過簡單了,注意我們建立此指令類的初衷,是給新使用者發一封電子郵件,歡迎他們的注冊。是以下面給 WelcomeNewUsers 類的 handle 方法實作一些代碼,
public function handle()
{
User::signedUpThisWeek()->each(function ($user) {
Mail::send(
'emails.welcome',
['name' => $user->name],
function ($m) use ($user) {
$m->to($user->email)->subject('Welcome!');
}
);
});
}
這個處理方法有些複雜,我一項一項講給你聽。
第一項,User 類是一個模型類,用于操作users表的資料。其中 signedUpThisWeek() 方法是我們手動注冊的 本地作用域,也就是說在 User 類内有一個本地作用域的方法,代碼如下:
public function scopeSignedUpThisWeek($query)
{
return $query->where('created_at', '>', Carbon::now()->subWeek());
}
篩選出所有建立時間在本周的使用者。該方法繼承了 Model 類,傳回的的是一個 Eloquent Collection,是以直接使用集合的 each 方法用于周遊查詢後的集合内的對象。周遊方法内是郵件發送的所有邏輯,這個我們會在後面的郵件和通知章節中專門講述。
書寫完畢後在指令行内使用
php artisan email:newusers
就會執行使用者查詢和郵件發送的流程。
寫在最後
本文我們使用了laravel的 Command 類建立了一個簡單的示例代碼,并手動實作了一個相對複雜的模型查詢和郵件發送類。想要實作這個功能還有很多工作要做,包括資料庫的配置,伺服器配置等等。是以,大家不必着急,慢慢我們都要講到。
Happy coding :-)
我是 @程式員小助手 ,專注程式設計知識,圈子動态的IT領域原創作者