Laravel 簡単なアプリケーション作成(2)
イベントを利用して会員登録時にメールを送る機能を追加
Laravelを利用して簡単なアプリケーションを作成する手順
今回はイベントを使用して会員登録時にメールを送信する機能を追加する
イベントとは、プログラムで発生する様々な事象を別のオブジェクトに通知し、その事象に対応した処理【リスナー】を実行する機能。
環境
前回までの環境を利用する
手順概要
- メール送信設定
- イベントとリスナーファイルの設定
- リスナークラスの実装
メール送信設定
Homesteadに同梱される"MailHog"というSMTPサーバを使用する。
管理画面は
http://homestead.test:8025 にアクセスすることでGUI表示できる。
sampleapp/.env を編集
sampleapp/.env
MAIL_DRIVER=smtp
MAIL_HOST=localhost
MAIL_PORT=1025
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
リスナーファイルの設定
通常、イベントとリスナーの実装が必要だが、イベントはLaravelに含まれるものを利用するためリスナーのみ実装する。
下記ファイルに追加してリスナーを定義する。
app/Providers/EventServiceProvider.php
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
],
'App\Events\Event' => [
'App\Listeners\EventListener',
],
'Illuminate\Auth\Events\Registered' => [
'App\Listeners\RegisteredListener',
],
];
sampleappディレクトリに移動し、下記コマンドを実行してリスナークラスを作成する。
app以下にListenerディレクトリが生成され、EventListener.php, RegisterListener.phpが生成されている。
$ php artisan event:generate
Events and listeners generated successfully!
$
生成されてるか確認
$ ls app/
Console Events Exceptions Http Listeners Providers User.php
$ tree -L 1 app/Listeners/
app/Listeners/
├── EventListener.php
└── RegisteredListener.php
0 directories, 2 files
$
リスナークラスの実装
Listeners/RegisteredListenered.php に処理を追加
Listeners/RegisteredListenered.php
<?php
namespace App\Listeners;
// add for mailer
use App\User;
use Illuminate\Auth\Events\Registered;
use Illuminate\Mail\Mailer;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class RegisteredListener
{
private $mailer;
private $eloquent;
/**
* Create the event listener.
*
* @return void
*/
public function __construct(Mailer $mailer, User $eloquent)
{
$this->mailer = $mailer;
$this->eloquent = $eloquent;
}
/**
* Handle the event.
*
* @param Registered $event
* @return void
*/
public function handle(Registered $event)
{
$user = $this->eloquent->findOrFail($event->user->getAuthIdentifier());
$this->mailer->raw('会員登録完了しました。', function($message) use ($user){
$message->subject('会員登録メール')->to($user->email);
});
}
}