Events

Laravel 5.1 のイベント機能を試してみます。
ユーザー登録の完了イベントを発行し、そのイベントを受けてウェルカムメールを送信してみます。


イベントとリスナーの登録

app/Providers/EventServiceProvider.php にイベントとイベントリスナーを登録します。

<?php // app/Providers/EventServiceProvider.php

namespace App\Providers;

...

class EventServiceProvider extends ServiceProvider {
	protected $listen = [
		'App\Events\UserWasRegistered' => [ // ① イベント
			'App\Listeners\SendWelcomeMail', // ② リスナー
		],
	];

	...
}

① イベントを登録します。
app/Eventsディレクトリ以下のクラスとして登録します。

② ①のイベントが発生した時に実行される、リスナーを登録します。
app/Listenersディレクトリ以下のクラスとして登録します。
必要であれば、複数登録できます。


イベントとリスナーの生成

php artisan event:generate

event:generateは、app/Providers/EventServiceProvider.phpを参照して、イベントクラスとリスナークラスを生成します。

  • app/Events/UserWasRegistered.php
  • app/Listeners/SendWelcomeMail.php

イベントクラス

app/Events/UserWasRegistered.phpを以下のように編集します。

<?php // app/Events/UserWasPegistered.php

namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

use App\User; // ’①

class UserWasRegistered extends Event {
    use SerializesModels;

    public $user;

    public function __construct(User $user)  // ①
    {
        $this->user = $user;
    }

    public function broadcastOn()
    {
        return [];
    }
}

① コンストラクタで App\Userクラスを受け取るようにします。


リスナークラス

app/Listeners/SendWelcomeMail.phpを以下のように編集します。

<?php // app/Listeners/SendWelcomeEmail.php

namespace App\Listeners;

use App\Events\UserWasRegistered;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail
{
    public function __construct()
    {
        //
    }

    public function handle(UserWasRegistered $event) // ①
    {
        // ② ウェルカムメールを送信
        $user = $event->user;
        \Mail::send('emails.welcome', compact('user'), function($message) use ($user) {
            $message->to($user->email, $user->name)->subject('Welcome!');
        });
    }
}

① イベントが発生した時に、handleメソッドがコールされます。
引数でイベントクラスのオブジェクトを受け取ります。
② イベント発生時に実行する処理を実装します。

もし、リスナーをキューとして扱いたければ、ShouldQueueインターフェースを追加します。

<?php // app/Listeners/SendWelcomeEmail.php

namespace App\Listeners;

use App\Events\UserWasRegistered;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail implements ShouldQueue // <-- 追加
{
    // ...
}

ビュー

ウェルカムメールのテンプレートを作成します。

{{-- resources/views/emails/welcome.blade.php --}}

ようこそ {{ $user['name'] }}

イベントの発火

app/Http/Controllers/Auth/AuthController.phpを以下のように修正して、ユーザー作成後にイベントを発火します。

<?php // app/Http/Controllers/Auth/AuthController.php

namespace App\Http\Controllers\Auth;

...

use App\Events\UserWasRegistered; // 追加

class AuthController extends Controller
{
    ...

    protected function create(array $data)
    {
        $user = User::create([
            'name' => $data['name'],
            'email' => $data['email'],
            'password' => bcrypt($data['password']),
        ]);

        // イベントを発火
        \Event::fire(new UserWasRegistered($user));

        return $user;
    }
}

動作確認

以下のURLからユーザー登録を行います。
ウェルカムメールが届けば成功です。

http://localhost:8000/auth/register

※ 事前にメールの環境設定認証のセットアップが必要です。


まとめ

イベントに関して、以下の手順を理解することができました。

  • イベントとリスナーの登録
  • イベントとリスナーの生成
  • イベントクラス
  • リスナークラス
  • イベントの発火

詳細は公式ドキュメントをご覧ください。

http://laravel.com/docs/5.1/events

コメントを残す

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

WordPress.com ロゴ

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

Twitter 画像

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

Facebook の写真

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

Google+ フォト

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

%s と連携中