Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 31.01.2021 07:51:13

Как организовать смену Email после подтверждения?

Всем привет, я только знакомлюсь с разработкой на Laravel, и столкнулся с такой проблемой, как организовать смену email пользователя из его личного кабинета, только после подтверждения новой почты? Регистрацию с подтверждением Email я сделал, а вот как теперь таким же образом реализовать смену? При этом, если пользователь не подтвердил, то остается олд емэйл. Версия ларавел 5.8, помогите пожалуйста.

Изменено Wim91 (31.01.2021 07:52:46)

Не в сети

#2 28.02.2025 11:09:08

Re: Как организовать смену Email после подтверждения?

Привет! Отлично, что ты начинаешь работать с Laravel. Вот шаги, которые помогут тебе реализовать смену email пользователя с подтверждением новой почты:

Создание маршрута и контроллера:

Создай маршруты для отображения формы изменения email и для обработки подтверждения.

php
// web.php
Route::get('profile/change-email', 'ProfileController@showChangeEmailForm')->name('profile.change-email');
Route::post('profile/change-email', 'ProfileController@sendChangeEmailLink');
Route::get('profile/verify-new-email/{token}', 'ProfileController@verifyNewEmail')->name('profile.verify-new-email');
Форма изменения email:

Создай форму в твоем шаблоне для ввода нового email.

html
<!-- change-email.blade.php -->
<form method="POST" action="{{ route('profile.change-email') }}">
    @csrf
    <input type="email" name="new_email" required>
    <button type="submit">Change Email</button>
</form>
Контроллер:

В контроллере обработай ввод нового email и отправь ссылку для подтверждения.

php
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Illuminate\Http\Request;

class ProfileController extends Controller
{
    public function showChangeEmailForm()
    {
        return view('change-email');
    }

    public function sendChangeEmailLink(Request $request)
    {
        $request->validate(['new_email' => 'required|email|unique:users,email']);

        $token = Str::random(60);
        $user = Auth::user();
        $user->new_email = $request->new_email;
        $user->email_verification_token = $token;
        $user->save();

        Mail::send('emails.verify-new-email', ['token' => $token], function ($message) use ($request) {
            $message->to($request->new_email);
            $message->subject('Verify Your New Email Address');
        });

        return back()->with('message', 'A verification link has been sent to your new email address.');
    }

    public function verifyNewEmail($token)
    {
        $user = User::where('email_verification_token', $token)->firstOrFail();
        $user->email = $user->new_email;
        $user->new_email = null;
        $user->email_verification_token = null;
        $user->save();

        return redirect()->route('home')->with('message', 'Email address updated successfully.');
    }
}
Шаблон письма для подтверждения:

Создай шаблон письма для отправки ссылки подтверждения.

html
<!-- resources/views/emails/verify-new-email.blade.php -->
<a href="{{ route('profile.verify-new-email', $token) }}">Click here to verify your new email address</a>
Миграция для добавления новых полей:

Если у тебя еще нет полей для нового email и токена в таблице пользователей, создай миграцию.

php
Schema::table('users', function (Blueprint $table) {
    $table->string('new_email')->nullable();
    $table->string('email_verification_token')->nullable();

Не в сети

Подвал раздела