LoginSignup
5
4

More than 3 years have passed since last update.

Homestead MailHog を利用する

Posted at

Laravel 簡単なアプリケーション作成(2)

イベントを利用して会員登録時にメールを送る機能を追加

Laravelを利用して簡単なアプリケーションを作成する手順

今回はイベントを使用して会員登録時にメールを送信する機能を追加する

イベントとは、プログラムで発生する様々な事象を別のオブジェクトに通知し、その事象に対応した処理【リスナー】を実行する機能。

環境

前回までの環境を利用する

手順概要

  1. メール送信設定
  2. イベントとリスナーファイルの設定
  3. リスナークラスの実装

メール送信設定

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);
        });
    }
}
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4