Artisan Console

PHP:7.2

Laravel:5.8

Artisan 是 Laravel 提供的命令列工具,底層是由 Symfony/Console 實作,對於一些環境建設或是資料 migrate 都是不可或缺的小幫手。

除了方便之外,最重要的是,除了原本的指令,我們也可以自行開發指令來完成我們的需求。

Basic Usage

# 列出 artisan 的指令清單
php artisan list

Writing Commands

要建立屬於自己的 Command,也是透過 artisan 指令來完成。

建立 SendEmails Command

php artisan make:command SendEmails

建立完成以後,就可以在新產生的檔案中進行需要的修改。

app/Console/Commands/SendEmails.php 基本結構

namespace App\Console\Commands;

use Illuminate\Console\Command;

class SendEmails extends Command
{
    // 指令名稱
    protected $signature = 'command:name';

    // Command 說明
    protected $description = 'Command description';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        // 邏輯寫在此
    }
}

完成之後,只要就可以直接使用 php artisan command:name 便可以執行自訂的 Command 了。

Parameters

除了基本的使用,Command 也可以搭配許多參數配合使用。

設定參數

// 自訂 argument
// php artisan send:email johnsonlu
protected $signature = 'send:email {user}';

// Optional argument
protected $signature = 'send:email {user?}';

// Optional argument 並設定初始值
protected $signature = 'send:email {user=foo}';

// Argument array
// php artisan send:email johnsonlu yolandalin
protected $signature = 'send:email {user*}';

// 自訂 options,queue 不能傳入值,只能當 switch 使用
// php artisan send:email johnsonlu --queue
protected $signature = 'send:email {user} {--queue}';

// 自訂 options 並設定初始值(可傳入值)
// php artisan send:email johnsonlu --queue="TEST"
protected $signature = 'send:email {user} {--queue=default}';

// Options 簡寫
// php artisan send:email johnsonlu -Q="TEST"
protected $signature = 'send:email {user} {--Q|queue}';

// Options array
// php artisan send:email johnsonlu --queue="TEST" --queue="TEST2"
protected $signature = 'send:email {user} {--queue=*}';

// 為參數加上說明
protected $signature = 'send:email
                        {user : The ID of the user}
                        {--queue= : Whether the job should be queued}';

取得參數

public function handle()
{
    // 取得特定argument
    $value = $this->argument('name');

    // 取得所有argument
    $arguments = $this->argument();

    // 取得特定option
    $value = $this->option('queue');

    // 取得所有option
    $options = $this->option();
}

Input and Output

另外,指令執行後的輸出也很重要,可以透過 Command 提供的 methods 來進行輸出。

public function handle()
{
    // 顯示用 method
    $this->info('Display this on the screen');
    $this->comment('Hello');
    $this->question('???');
    $this->error('Something went wrong!');
    $this->line('Display this on the screen');

    // Input
    $name = $this->ask('What's your name);
    // Input Secret
    $password = $this->secret('What is the password?');

    // Confirm
    if ($this->confirm('Do you wish to continue?')) {
        // do something
    }

    // 輸入時有 autocomplete 功能
    $name = $this->anticipate('What is your name?', ['Taylor', 'Johnson']);

    // Choice question
    $defaultIndex = 0;
    $name = $this->choice('What is your name?', ['Taylor', 'Dayle'], $defaultIndex);
}

Use Artisan in Code Level

Artisan 也可以在 code level 中呼叫。

Controller Example

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Artisan;

class TestController extends Controller
{
    public function test(Request $request)
    {
        Artisan::call('send:mail', [
            // Argument
            'name' => 'johnsonlu',
            // Option
            '--queue' => 'test1'
        ]);
    }
}
Categories: Laravel