'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
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 |
