Job Bus:コンソールコマンド編

前々回、ユーザー登録処理をコントローラからJobクラスに抽出して、再利用可能にしました。今回はコンソールコマンドを作ることで、コントローラ以外の場所でJob Busを使う方法を試します。

※ Laravel 5.0の Command Busは v5.1で Job Busに変更されました。


お題

コンソールコマンドを作成して、コンソール端末上でユーザー登録を可能にします。コンソールコマンドの中で、Job Bus経由でJobクラスを実行します。


前々回の復習

以下のJobクラスを作成しました。このクラスがあることを前提に進めます。

<?php // app/Commands/RegisterUser.php

namespace App\Jobs;

use App\Jobs\Job;
use App\User;
use Illuminate\Contracts\Bus\SelfHandling;
use Illuminate\Contracts\Validation\ValidationException;

class RegisterUser extends Job implements SelfHandling
{
    private $data = [];

    public function __construct($name, $email, $password, $password_confirmation)
    {
        // Jobに必要なデータを受け取る
        $this->data['name'] = $name;
        $this->data['email'] = $email;
        $this->data['password'] = $password;
        $this->data['password_confirmation'] = $password_confirmation;
    }

    public function handle()
    {
        // バリデーションチェック
        $validator = $this->validator();
        if ($validator->fails()) {
            throw new ValidationException($validator); // 例外をスロー
        }

        // ユーザー登録
        $this->register();
    }

    protected function validator()
    {
        return \Validator::make($this->data, [
            'name' => 'required|max:255',
            'email' => 'required|email|max:255|unique:users',
            'password' => 'required|confirmed|min:6',
        ]);
    }

    protected function register()
    {
        return User::create([
            'name' => $this->data['name'],
            'email' => $this->data['email'],
            'password' => bcrypt($this->data['password']),
        ]);
    }
}

コンソールコマンドクラスの生成

artisanを使って、コンソールコマンドクラスを生成します。

php artisan make:console RegisterUser

app/Console/Commands/RegisterUser.php が生成されるので、以下のように編集します。

<?php // app/Console/Commands/RegisterUser.php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Illuminate\Contracts\Validation\ValidationException;
use Illuminate\Foundation\Bus\DispatchesJobs;
use App\Jobs\RegisterUser as RegisterUserJob; // ①

class RegisterUser extends Command
{
    use DispatchesJobs; // ②

    // ③ コマンド名、引数
    protected $signature = 'user:register
                            {name : ユーザー名}
                            {email : メールアドレス}
                            {password : パスワード}';

    // コマンドの説明
    protected $description = 'ユーザーを登録する';

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

    public function handle() // ④
    {
        // 引数取得
        $data = $this->argument();

        // ⑤ 確認用パスワードをセット
        $data['password_confirmation'] = $data['password'];

        try {
            // ⑥ Job Bus経由で、RegisterUserJobを実行
            $this->dispatchFromArray(RegisterUserJob::class, $data);

            $this->info("{$data['name']}を登録しました。");
        } catch (ValidationException $e) {
            // エラーメッセージを表示
            $messages = $e->getMessageProvider()->getMessageBag()->all();
            foreach($messages as $message) {
                $this->error($message);
            }
        }
    }
}

① Jobクラスである、App\Jobs\RegisterUserを RegisterUserJobという別名でインポートします。

② DispatchesJobsトレイトを追加して、Job Busを利用できるようにします。

③ コマンド名と引数を定義します。

④ handle() メソッドがコンソールコマンドのメイン処理になります。

⑤ Jobクラス内のバリデーションチェックではパスワードと確認用パスワードのチェックを行っています。このコンソールコマンドでは確認用パスワードを引数で受け取らない為、バリデーションチェックを通すために、パスワードの内容を確認用パスワードにコピーしています。

⑥ Job Busの dispatchFromArray() メソッドを使って、RegisterUserJobを実行しています。dispatchFromArray()を使うことで、$data配列の内容を RegisterUserJobのコンストラクタに自動でマッピングしてくれます。


コンソールコマンドを登録

app/Console/Commands/Kernel.php に生成したクラスを登録します。

<?php  // app/Console/Kernel.php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    protected $commands = [
        \App\Console\Commands\RegisterUser::class, // 登録
    ];

    // ...
}

artisan を実行して、コマンドが登録されたか確認します。

$ php artisan

Usage:
 command [options] [arguments]

...
user
  user:register            ユーザ一を登録する
...
$ php artisan help user:register
Usage:
 user:register name email password

Arguments:
 name                  ユーザ名
 email                 メールアドレス
 password              パスワード
...

動作確認

コンソールコマンドで、ユーザー登録を行ってみます。

$ php artisan user:register marty marty@mcfly.com password1955
marty を登録しました。

成功です。

$ php artisan user:register marty invalid_address 1955
The email must be a valid email address.
The password must be at least 6 characters.

バリデーションチェックも機能しています。


まとめ

DispatchesJobsトレイトを使って、Job Busをコントローラー以外の場所で実装することができました。

前々回の記事から通しで見てみると、Job Busを使うことで、ユーザー登録処理を再利用可能なJobクラスに抽出することができました。それを利用することで、ビジネスロジックは一元化したまま、WWWブラウザ画面(HTTP)からもコンソールコマンド(artisan)からもユーザー登録が可能になりました。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中