Как отправить письмо с подтверждением на новый адрес электронной почты в Laravel? - PullRequest
1 голос
/ 29 мая 2020

У меня есть форма для изменения текущего адреса электронной почты пользователя. Я хочу, чтобы, когда пользователь меняет свой текущий адрес электронной почты на новый, автоматически отправлялось письмо с подтверждением на этот новый адрес электронной почты, где пользователь мог бы подтвердить это письмо. Как это можно сделать? Вот мой код. Любая помощь приветствуется.

UserProfileController. php

public function changeEmailAddress(UpdateEmailRequest $request)
{
    if ($request->new_email != $request->repeat_email)
        return response()->json(['status' => 'Emails do not match.'], 404);

    if ($request->new_email == $request->user()->email)
        return response()->json(['status' => 'Email cannot be the same as old email'], 404);

    if(sizeof(User::where('email','=',$request->new_email)->get()) > 0)
        return response()->json(['status' => 'Email already exists'], 404);

    $request->user()->email = $request->new_email;
    $request->user()->email_verified_at = null;
    $request->user()->save();

    return response()->json(['status' => 'success'], 200);
}

index.blade. php

<section data-edit="email" class="editEmail">
    <form action="{{ route('user.update.email') }}" method="POST" class="flex">
        @method('PATCH')
        @csrf
        <div class="form-group">
            <input type="text" placeholder="New Email Adress" name="new_email">
        </div>
        <div class="form-group">
            <input type="text" placeholder="Repeat Email Adress" name="repeat_email">
        </div>
        <div class="form-group">
            <button class="submit">BUTTON</button>
        </div>
    </form>
</section>

web. php

Route::patch('/profile/change-email', 'UserProfileController@changeEmailAddress')- 
 >name('user.update.email');

UpdateEmailRequest. php

public function rules()
{
    return [
        'email' => ['string', 'email', 'max:255', 'unique:users,email'],
    ];
 }

Ответы [ 2 ]

0 голосов
/ 29 мая 2020

Короткий ответ:

Все, что вам нужно сделать, это позвонить event(new \Illuminate\Auth\Events\Registered($user));

Если это не сработает, возможно, вам нужно сначала настроить несколько вещей (см. Более длинный ответ).

Более длинный ответ:

Есть несколько вещей, которые вам понадобятся, чтобы добавить внутреннюю поддержку для проверки электронной почты пользователя.

Первый шаг - убедиться, что ваш * Модель 1012 * реализует правильные методы:

// app/User.php:
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail {
    // this provides:
    //  ->markEmailAsVerified(),
    //  ->hasVerifiedEmail(): bool
    //  ->sendEmailVerificationNotification()
    use \Illuminate\Auth\MustVerifyEmail;

Есть хорошее встроенное событие, которое вы затем можете использовать, чтобы отправить электронное письмо пользователям после их регистрации. Вы можете активировать это вручную или как часть слушателя модели (здесь не обсуждается). Однако сначала это необходимо зарегистрировать в ваших слушателях событий. Для получения дополнительной информации см. Laravel Руководство по событиям .

// app/Providers/EventServiceProvider.php:
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;

class EventServiceProvider extends ServiceProvider {

    protected $listen = [
        // ...
        'Illuminate\Auth\Events\Registered' => [
            'Illuminate\Auth\Listeners\SendEmailVerificationNotification',
        ],

После того, как эти две вещи будут выполнены, отправку подтверждающего письма можно будет сделать в любом месте вашего приложения:

// fire off the Registered event, so that new users get a verification email
event(new \Illuminate\Auth\Events\Registered($user));

Это будет работать, только если прослушиватель событий установлен и User имеет правильную иерархию.

Обработчик событий (SendEmailVerificationNotification) проверяет, является ли $user MustVerifyEmail это еще не подтверждено, и если это так, он вызывает $user->sendEmailVerificationNotification, который запускает экземпляр \Illuminate\Auth\Notifications\VerifyEmail.

0 голосов
/ 29 мая 2020

To laravel 5.7+ реализует MustVerifyEmail в вашем App\Models\User или App\User

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];
}

и в app/routes/web.php

Добавьте такие маршруты, как email / verify и email / повторно отправить в приложение:

Auth::routes(['verify' => true]);

и просто в вашем методе просто назовите это:

$user->sendEmailVerificationNotification();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...