3分鐘短文:Laravel寫個命令列,你就是下一個Geek!

程式設計師小助手發表於2020-10-26

引言

習慣了在windows下敲敲點點的同學,習慣了沒有視窗檢視就無從下手的同學,來到linux第一個面臨的問題就是,core發行版根本不提供gui,太費空間,太費資源,要啥視窗?

所以電影裡看到很多懂的,不懂的,懂的裝不懂的,不懂的裝懂的那麼演員們,都在奮力敲擊鍵盤,一串串熒幕輸出像火箭似的飛速狂奔。這大概只有拷貝檔案,或者debug時才能有的盛舉吧。

img

沒錯兒,在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 協議》,轉載必須註明作者和本文連結
write-less-do-more-make-you-out-of-door

相關文章