引言
習慣了在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領域原創作者
本作品採用《CC 協議》,轉載必須註明作者和本文連結