'How can I populate a db column upon clicking the verify email address button contained in the email?

I'd like to know how I can populate the email_verified_at column with a timestamp upon the user clicking on the Verify Email Address contained in the verification email that's being sent.

I thought it'd be a straightforward thing to do hence my attempt below in the EmailVerificationController.php file but it didn't work.

What am I doing wrong and how can I fix it? Any feedback is appreciated :)

Here's api.php

Route::group(['middleware' => ['auth:sanctum', 'verified']], function () {

Route::post('email/verification-notification', [EmailVerificationController::class, 'sendVerificationEmail']);

Route::get('email/verify/{id}/{hash}',            function (EmailVerificationRequest $request) {
    $request->fulfill();
    return redirect('/');
})->name('verification.verify');

});

Here's EmailVerificationController.php:

<?php

namespace App\Http\Controllers;

use App\Models\User;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Auth\Events\Verified;
use Illuminate\Foundation\Auth\EmailVerificationRequest;

class EmailVerificationController extends Controller
{
    public function sendVerificationEmail(Request $request)
    {

        if ($request->user()->hasVerifiedEmail()) {
            return [
                'message' => 'Already Verified'
            ];
        }

        $request->user()->sendEmailVerificationNotification();

        return ['status' => 'verification-link-sent'];
    }

    public function verify(EmailVerificationRequest $request)
    {
        if ($request->user()->hasVerifiedEmail()) {
            return [
                'message' => 'Email already verified'
            ];
        } 

        if ($request->user()->markEmailAsVerified()) {
            event(new Verified($request->user()));
            $time             = Carbon::now();
            $timeStamp        = $time->toDateTimeString();

            User::create([
               'email_verified_at' => $timeStamp
            ]);
        }

        return [
            'message'=>'Email has been verified'
        ];
    }
}

Here's AuthController.php

    public function register(Request $request)
    {

        try {
            $request->validate([
                'name'           => 'required',
                'email'          => 'required|email|unique:users',
                'age'            => 'required',
                'password'       => 'required|min:6',
            ]);

            $data                = $request->all();

            $dbData = [
                'name'           => $data['name'],
                'email'          => $data['email'],
                'age'            => $data['age'],
                'password'       => Hash::make($data['password'])
            ];

            $user                = User::create($dbData);

            event(new Registered($user));

            return response()->json([
                "status"         => true,
                "message"        => "Registered Successfully!",
                'token'          => $user->createToken('tokens')->plainTextToken
            ]);
        } catch(\Exception $e) {
            Log::error($e->getMessage());
            throw new \Exception($e->getMessage(), $e->getCode(), $e);
        }

    }


Solution 1:[1]

You need to implement Laravel’s Must Verify Email feature in the API registration

Follow this tutorial

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Eng Abdelhafz