Automatically send "Email verification" email after successful register in Laravel

Viewed 587

I want to Automatically send "Email verification" email after a successful register in Laravel 8.5

My RegisterController:

namespace App\Http\Controllers;    
use Illuminate\Http\Request;
use App\User;
use Illuminate\Support\Facades\Hash;
use Illuminate\Auth\Events\Registered;

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        $request->validate([
            'name' => ['required'],
            'email' => ['required', 'email', 'unique:users'],
            'password' =>['required', 'min:6', 'confirmed']
        ]);

        User::create([
            'name' => $request->name,
            'email' => $request->email,
            'password' => Hash::make($request->password)
        ]);
    }
}

I have this two routes which work, but I have to do it manualy:

Route::post('email/verification-notification', [EmailVerificationController::class, 'sendVerificationEmail'])->middleware('auth:sanctum');
Route::get('verify-email/{id}/{hash}', [EmailVerificationController::class, 'verify'])->name('verification.verify')->middleware('auth:sanctum');

In Laravel docs I found that I should add event(new Registered($User)); in my register controller but variable $user is not defined. What should I pass as variable?

1 Answers

The variable you shall pass must be a User object, that means that you either have to fetch it from the database after creation or save the new user in a variable, have a look at the code below :)

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        $request->validate([
            'name' => ['required'],
            'email' => ['required', 'email', 'unique:users'],
            'password' =>['required', 'min:6', 'confirmed']
        ]);

        $user = new User(); 
        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = Hash::make($request->password);
        $user->save();

        event(new Registered($user));
    }
}

Hopefully the code above will give you the result you are looking for. Otherwise, fetch the new user from the database and pass it to the Registered event such as this:

event(new Registered(User::where('email', $request->email)->first()));

Good luck! :)

Related