##通知処理の実態
make:auth
で実装されるものは基本的な処理のみで
骨格となる処理はvendor/laravel/framework配下に実装されている
###メール内容の多言語化
メール本文は以下のphpで実装されている。
vendor/laravel/framework/src/Illuminate/Auth/Notifications
ResetPassword.php⇒パスワードリセット通知
VerifyEmail.php⇒登録時認証メール通知
Lang::getFromJson()
でja.jsonの置換を行っている。
メールのヘッダーフッターは以下のファイルを使用している。
vendor/laravel/framework/src/Illuminate/Notifications/resources/views/
配下にある。
email.blade.php
@lang()
に囲われた文字列をja.jsonに定義することで変換される
@lang(
"If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\n".
'into your web browser: [:actionURL](:actionURL)',
[
'actionText' => $actionText,
'actionURL' => $actionUrl,
]
)
上記は複雑ですが.
を削除して、文字列を連結してja.jsonに定義すれば翻訳されるようです。
{
(略)
"If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser: [:actionURL](:actionURL)": "もし\":actionText\"ボタンをクリックできない場合は、以下のURLをコピー&ペーストして、ブラウザから入力してください。[:actionURL](:actionURL)"
(略)
}
独自のメールにしたい場合は、先人たちの例に沿って既存の通知処理をカスタムする。
参考URL
Laravelパスワードリセットメールの文面・デザインを変更する
###認証メール・パスワード再設定メールのカスタム
以下のコマンドでそれぞれの通知クラスを作成する
$ php artisan make:notification CustomResetPasswordNotification
$ php artisan make:notification CustomVerifyEmailNotification
app/Notifications
フォルダが作成され、phpファイルが生成される。
####リセット通知のカスタム
#####通知クラスとメール内容の変更
toMail()
を以下のように変える。
use Illuminate\Auth\Notifications\ResetPassword; // ResetPasswordクラス参照
class CustomResetPasswordNotification extends Notification
{
public $token;
// public function __construct()
public function __construct($token)
{
$this->token = $token;
}
public function toMail($notifiable)
{
return (new MailMessage)
->subject(__('Reset Password'))
->view('vendor.notifications.email')
->action(__('Reset Password'), url('password/reset', $this->token));
}
}
標準のemail.blade.php
をresources/views/vendro/notifications/
に用意する。
メールの定型文を大幅に変える場合、email.blade.phpを複製してカスタマイズする。
追記
view()
にすると例外が発生するのでmarkdown()
にする。
定型文に則ると以下の感じ。
public function toMail($notifiable)
{
return (new MailMessage)
->markdown('vendor.notifications.email', [
'actionText' => __('Reset Password'),
'introLines' => [
__('You are receiving this email because we received a password reset request for your account.'),
],
'outroLines' => [
__('If you did not request a password reset, no further action is required.'),
],
])
->action(__('Reset Password'), url('password/reset', $this->token))
->subject(__('Reset Password Notification'));
}
パスワードリセットと登録認証でそれぞれ定型文ファイルを分けるなら
引数で渡す必要はないので以下のように修正。
$ cp ./resources/views/vendor/notifications/email.blade.php ./resources/views/vendor/notifications/reset.blade.php
通知クラスの呼び出しを簡素化
public function toMail($notifiable)
{
return (new MailMessage)
->markdown('vendor.notifications.reset')
->action(__('Reset Password'), url('password/reset', $this->token))
->subject(__('Reset Password Notification'));
}
bladeファイルに多言語対応する場合は上述の通り、__(...)
を@lang(...)
に置換する。
認証通知メールのカスタム
#####通知クラスの変更
リセットと同様に変更するが、認証するため必要なURLを取得するためのメソッドverificationUrl
が
Notifications
にはなくIlluminate\Auth\Notifications\VerifyEmail
にあるのでこちらを継承する。
use Illuminate\Auth\Notifications\VerifyEmail; // クラス参照
//class CustomVerifyEmailNotification extends Notification
class CustomVerifyEmailNotification extends VerifyEmail
{
public function toMail($notifiable)
{
return (new MailMessage)
->markdown('vendor.notifications.verify')
->action(__('Verify Email Address'), $this->verificationUrl($notifiable)) // verificationUrl()で認証URL取得
->subject(__('Verify Email Address'));
}
#####Userモデルの変更
use Illuminate\Contracts\Auth\MustVerifyEmail as ContractsMustVerifyEmail; // Illuminate\Auth\MustVerifyEmailと名称が被る為、別名
use Illuminate\Auth\MustVerifyEmail;
use App\Notifications\CustomResetPasswordNotification;
use App\Notifications\CustomVerifyEmailNotification;
class User extends Authenticatable implements ContractsMustVerifyEmail
{
use Notifiable;
use MustVerifyEmail;
(略)
/**
* Send the email verification notification.
*
* @return void
*/
public function sendEmailVerificationNotification()
{
$this->notify(new CustomVerifyEmailNotification());
}