Skip to content

Commit 95e96e1

Browse files
authored
Email verification (#47)
* Update User.php * Implement email verification notice page * Add route to verify email * Add ability to resend verification email
1 parent e1dc034 commit 95e96e1

File tree

8 files changed

+86
-8
lines changed

8 files changed

+86
-8
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use Illuminate\Foundation\Auth\EmailVerificationRequest;
6+
use Illuminate\Http\Request;
7+
8+
class EmailVerificationController extends Controller
9+
{
10+
public function show()
11+
{
12+
return \inertia('EmailVerification/Show');
13+
}
14+
15+
public function store(EmailVerificationRequest $request)
16+
{
17+
$request->fulfill();
18+
19+
return \redirect()->route('home');
20+
}
21+
22+
public function update(Request $request)
23+
{
24+
$request->user()->sendEmailVerificationNotification();
25+
26+
\session()->flash('message', \__('account.verification-resent'));
27+
28+
return \back();
29+
}
30+
}

app/Http/Controllers/RegisterController.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use App\Enums\Role;
66
use App\Http\Requests\Register\RegisterStore;
77
use App\Models\User;
8+
use Illuminate\Auth\Events\Registered;
89

910
class RegisterController extends Controller
1011
{
@@ -36,6 +37,8 @@ public function store(RegisterStore $request)
3637

3738
\auth()->loginUsingId($user->id);
3839

40+
\event(new Registered($user));
41+
3942
return \redirect()->route('home');
4043
}
4144
}

app/Models/User.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,11 @@
22

33
namespace App\Models;
44

5-
// use Illuminate\Contracts\Auth\MustVerifyEmail;
6-
75
use App\Enums\Role;
86
use Filament\Models\Contracts\FilamentUser;
97
use Filament\Models\Contracts\HasName;
108
use Filament\Panel;
9+
use Illuminate\Contracts\Auth\MustVerifyEmail;
1110
use Illuminate\Database\Eloquent\Casts\Attribute;
1211
use Illuminate\Database\Eloquent\Factories\HasFactory;
1312
use Illuminate\Foundation\Auth\User as Authenticatable;
@@ -16,7 +15,7 @@
1615
use Laravel\Sanctum\HasApiTokens;
1716
use Spatie\Permission\Traits\HasRoles;
1817

19-
class User extends Authenticatable implements FilamentUser, HasName
18+
class User extends Authenticatable implements FilamentUser, HasName, MustVerifyEmail
2019
{
2120
use HasApiTokens;
2221
use HasFactory;

lang/en/account.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@
22

33
return [
44
'updated' => 'Your account has been updated.',
5+
'verification-success' => 'Your email address has been verified.',
6+
'verification-resent' => 'A new verification link has been sent.',
57
];

resources/js/Components/Button.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<button class="rounded-md w-full bg-slate-800 px-6 py-3 text-sm font-semibold text-white shadow-sm hover:bg-slate-500">
2+
<button class="rounded-md bg-slate-800 px-6 py-3 text-sm font-semibold text-white inline-flex shadow-sm hover:bg-slate-500">
33
<span v-text="text"></span>
44
</button>
55
</template>

resources/js/Layouts/App.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
label: "Account",
4444
route: route("account.edit"),
4545
condition: true,
46-
components: ['Account/Edit'],
46+
components: ['Account/Edit', 'EmailVerification/Show'],
4747
},
4848
{
4949
label: "Organisation",
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<template>
2+
<Head :title="title" />
3+
4+
<div class="mx-auto max-w-2xl bg-white rounded-2xl lg:p-10 p-6 border border-slate-200 text-center">
5+
<p>
6+
Please verify your email address by clicking on the link we just emailed to you.
7+
</p>
8+
<Button
9+
@click="resend"
10+
class="mt-6"
11+
text="Resend Verification Email"
12+
/>
13+
</div>
14+
</template>
15+
16+
<script>
17+
import { router } from "@inertiajs/vue3";
18+
19+
export default {
20+
data() {
21+
return {
22+
title: "Email Verification",
23+
};
24+
},
25+
26+
methods: {
27+
resend() {
28+
router.post(route('verification.send'), {
29+
preserveScroll: true,
30+
preserveState: true,
31+
});
32+
},
33+
},
34+
};
35+
</script>

routes/web.php

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,22 +21,31 @@
2121
->name('logout');
2222

2323
Route::controller(App\Http\Controllers\HomeController::class)
24-
->middleware(['auth'])
24+
->middleware(['auth', 'verified'])
2525
->group(function () {
2626
Route::get('/', 'index')->name('home');
2727
});
2828

2929
Route::controller(App\Http\Controllers\AccountController::class)
3030
->prefix('account')
31-
->middleware(['auth'])
31+
->middleware(['auth', 'verified'])
3232
->group(function () {
3333
Route::get('', 'edit')->name('account.edit');
3434
Route::patch('', 'update')->name('account.update');
3535
});
3636

37+
Route::controller(App\Http\Controllers\EmailVerificationController::class)
38+
->prefix('account')
39+
->middleware(['auth'])
40+
->group(function () {
41+
Route::get('verify', 'show')->name('verification.notice');
42+
Route::get('verify/{id}/{hash}', 'store')->middleware(['signed'])->name('verification.verify');
43+
Route::post('verify/resend', 'update')->middleware(['auth', 'throttle:6,1'])->name('verification.send');
44+
});
45+
3746
Route::controller(App\Http\Controllers\OrganisationController::class)
3847
->prefix('organisation')
39-
->middleware(['auth'])
48+
->middleware(['auth', 'verified'])
4049
->group(function () {
4150
Route::get('', 'edit')->name('organisation.edit');
4251
Route::patch('', 'update')->name('organisation.update');

0 commit comments

Comments
 (0)