Laravel 5.7にアップグレードしたばかりで、組み込みの電子メール検証を使用しています。しかし、私が理解できなかったことが2つあります。主な問題は、ユーザーに送信されるメールをカスタマイズして、メールを確認する方法です。また、ユーザーが電子メールを変更した場合、その電子メールの送信を開始する方法もわかりませんが、別のスレッド用に保存できます。
Laravel 5.7でメール検証を追加する場合、推奨される方法はIlluminate\Contracts\Auth\MustVerifyEmail
を実装し、Illuminate\Auth\MustVerifyEmail
モデルでApp\User
特性を使用することです。
カスタム動作を行うには、メソッドsendEmailVerificationNotification
をオーバーライドして、メソッドnotify
を呼び出して作成されたユーザーに通知し、Notifications\MustVerifyEmail
クラスの新しいインスタンスをパラメーターとして渡します。
ユーザーモデルのsendEmailVerificationNotificationメソッド内の$this->notify()
にパラメーターとして渡されるカスタム通知を作成できます。
public function sendEmailVerificationNotification()
{
$this->notify(new App\Notifications\CustomVerifyEmail);
}
...次にCustomVerifyEmail
通知で、検証の処理方法を定義できます。カスタムverification.routeでメールを送信することで、作成したユーザーに通知できます。これは、必要なパラメーターを取得します。
メール確認通知プロセス
新しいユーザーがサインアップすると、Illuminate\Auth\Events\Registered
イベントがApp\Http\Controllers\Auth\RegisterController
で発行され、そのRegistered
イベントには、Illuminate\Auth\Listeners\SendEmailVerificationNotification
に登録されたApp\Providers\EventServiceProvider
というリスナーがあります。
protected $listen = [
Registered::class => [
SendEmailVerificationNotification::class,
]
];
SendEmailVerificationNotification
リスナーは、Laravelデフォルト認証App\Http\Controllers\Auth\RegisterController
のnew Registered($user = $this->create($request->all()))
にパラメーターとして渡される$ userが、特性の名前であるIlluminate\Contracts\Auth\MustVerifyEmail
のインスタンスであるかどうかをチェックしますLaravelが示唆することは、デフォルトの電子メール検証を提供し、App\User
がまだ検証されていないことを確認するときに、$user
モデルで使用されます。すべてが成功すると、そのユーザーでsendEmailVerificationNotification
メソッドが呼び出されます。
if ($event->user instanceof MustVerifyEmail && !$event->user->hasVerifiedEmail()) {
$event->user->sendEmailVerificationNotification();
}
これを行う簡単な方法は、次のドキュメントを使用して新しい通知を作成することだと思います。 https://laravel.com/docs/5.7/notifications#creating-notifications
次に、関数をオーバーライドします。
public function sendEmailVerificationNotification()
{
$this->notify(new App\Notifications\CustomEmailNotification);
}
ユーザーモデル。
またはできる
php artisan vendor:publish --tag=laravel-notifications
これにより、テンプレートがresources/views/vendor/notificationsディレクトリにコピーされ、そこで変更できます。
すばやく簡単な方法:
php artisan vendor:publish --tag=laravel-notifications
次の場所に新しいファイルを作成しています。
\resources\views\vendor\notifications
これは、Laravelのメールプレートです。変更およびカスタマイズできます。
Andrew Earlsの回答をわずかに踏まえて、このコマンドを使用して、アプリケーションで使用されるすべてのマークダウンメールコンポーネントを公開することもできます。
php artisan vendor:publish --tag=laravel-mail
これが完了すると、resources/views/vendor/mail
で変更する一連のhtmlおよびmarkdownファイルが作成されます。これにより、メールの全体的なレイアウトを変更したり、CSSの「テーマ」を設定したりできます。 メールドキュメント-コンポーネントのカスタマイズ をよく読むことを強くお勧めします。
一般的なメールテーマのクイックスタート(Laravel 5.7)として、次のことができます。
php artisan vendor:publish --tag=laravel-mail
を使用してテーマを公開します。resources/views/vendor/mail/html/themes/default.css
を独自のファイルにコピーします。例:resources/views/vendor/mail/html/themes/wayne.css
config/mail.php
を編集し、表示される'theme' => 'default'
を'theme' => 'wayne'
に変更しますwayne.css
を編集して、メールのスタイルを変更します。それが誰かを助けることを願っています。
残念ながら、送信されるこのメールは「ビュー」からのものではなく、実際にインラインで構築されるNotification
です。これは、送信する必要があるときに現在構築されている場所です:Illuminate\Auth\Notifications\VerifyEmail@toMail
。この特定のクラスには静的なコールバックがあり、このコールバックを設定することで、この電子メールを作成する代わりに設定できます。
boot
メソッドのサービスプロバイダーでは、このクラスにコールバックを割り当てる必要があります。
これが「似たような」何かが機能するかもしれません:
public function boot()
{
\Illuminate\Auth\Notifications\VerifyEmail::toMailUsing(function ($notifiable) {
// this is what is currently being done
// adjust for your needs
return (new \Illuminate\Notifications\Messages\MailMessage)
->subject(\Lang::getFromJson('Verify Email Address'))
->line(\Lang::getFromJson('Please click the button below to verify your email address.'))
->action(
\Lang::getFromJson('Verify Email Address'),
$this->verificationUrl($notifiable)
)
->line(\Lang::getFromJson('If you did not create an account, no further action is required.'));
});
}
これは通知であるため、カスタマイズのオプションがさらに必要です。
独自のNotification
クラスを使用する場合は、sendEmailVerificationNotification
(User
)モデルのAuthenticatable
メソッドをオーバーライドできます(これはMustVerifyEmail
特性から) 。
2番目の質問:
必要なVerificationController
(App\Http\Controllers\Auth\VerificationController
)には、resend
(特性VerifiesEmails
から)という名前のメソッドがあり、この目的に適しています。
Auth::routes(['verify' => true]);
を介してこれらの検証ルートのルートを設定する必要があります
注意:
検証システムは、5.7のusers
テーブルemail_verified_at
のフィールドを使用してこれをマークします。このフィールドがあることを確認する必要があります。ユーザーが電子メールアドレスを変更すると、このnull
を作成し、resend
ルートにリダイレクトして、新しい検証を送信できると思います。これにより、再検証するまで、「未検証」状態になります。
更新:
私たちは正しい道を進んでいたようです。私はこのSOの答えを見つけましたが、これは似たようなことを上回ります
これらのファイルに移動します
vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.php
vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.php
そして、それをカスタマイズします。 vendor/laravel/framework/src/Illuminate/Auth/Notifications/VerifyEmail.phpにコンストラクターを導入し、vendor/laravel/framework/src/Illuminate/Auth/MustVerifyEmail.phpを介して値を渡すこともできます。
確認メールを送信するには、次のコードを使用するだけです。
// send new verification email to user
$user->sendEmailVerificationNotification();