Replace hand-rolled auth with Laravel Breeze (Livewire stack)
Adds the auth Breeze scaffolds that were missing before: password
reset and email verification, plus a profile page (update name/email,
change password, delete account). User now implements MustVerifyEmail
so verification is actually enforced, not just scaffolded.
This does mean accepting Tailwind v3 (postcss/tailwind.config.js)
over the v4 CSS-first setup the app started with, and Livewire drops
from ^4.3 to ^3.6.4 — both forced by Breeze/Volt's current
compatibility requirements. Restored the Instrument Sans font Breeze's
installer dropped so styling stays close to what we had.
Reconciliation, since Breeze's installer assumes a blank-slate app:
- Deleted the hand-rolled Login/Register Livewire components/views/
test — superseded by Breeze's Volt-based auth pages
(resources/views/livewire/pages/auth/*), which also cover
forgot-password, reset-password, verify-email, and confirm-password.
- Deleted Breeze's own default welcome/dashboard views and its
separate app layout + nav component — kept our existing
components/layouts/app.blade.php as the one real app layout, used
Breeze's minimal layouts/guest.blade.php only for the auth pages.
- Rewrote routes/web.php merging our routes (home, sites, discover)
with routes/auth.php; replaced every hardcoded route('dashboard')
reference (5 Blade files plus, easy to miss, a plain PHP controller
VerifyEmailController) with sites.index.
- Logout: Breeze's Actions\Logout::__invoke() returns void, so wired
directly as a route it silently no-ops instead of redirecting;
fixed with a thin closure that calls it then redirects.
- Fixed Breeze's own generated tests (Auth/AuthenticationTest,
RegistrationTest, EmailVerificationTest, PasswordConfirmationTest)
where they assumed the deleted dashboard route/nav component.
Verified: full suite (28 tests, including Breeze's Registration/
Authentication/PasswordReset/PasswordConfirmation/PasswordUpdate/
EmailVerification/Profile tests plus our own GuestPreviewTest) passes
against the huginn_testing MySQL database. Also smoke-tested for real:
all key pages return 200, /profile redirects guests to /login, guest
preview capping still works, and a real password-reset email was
generated and logged with correct branding and a working link.
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
use App\Http\Controllers\Auth\VerifyEmailController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
use Livewire\Volt\Volt;
|
||||
|
||||
Route::middleware('guest')->group(function () {
|
||||
Volt::route('register', 'pages.auth.register')
|
||||
->name('register');
|
||||
|
||||
Volt::route('login', 'pages.auth.login')
|
||||
->name('login');
|
||||
|
||||
Volt::route('forgot-password', 'pages.auth.forgot-password')
|
||||
->name('password.request');
|
||||
|
||||
Volt::route('reset-password/{token}', 'pages.auth.reset-password')
|
||||
->name('password.reset');
|
||||
});
|
||||
|
||||
Route::middleware('auth')->group(function () {
|
||||
Volt::route('verify-email', 'pages.auth.verify-email')
|
||||
->name('verification.notice');
|
||||
|
||||
Route::get('verify-email/{id}/{hash}', VerifyEmailController::class)
|
||||
->middleware(['signed', 'throttle:6,1'])
|
||||
->name('verification.verify');
|
||||
|
||||
Volt::route('confirm-password', 'pages.auth.confirm-password')
|
||||
->name('password.confirm');
|
||||
});
|
||||
+9
-12
@@ -1,11 +1,9 @@
|
||||
<?php
|
||||
|
||||
use App\Http\Controllers\SiteController;
|
||||
use App\Livewire\Auth\Login;
|
||||
use App\Livewire\Auth\Register;
|
||||
use App\Livewire\Actions\Logout;
|
||||
use App\Livewire\Discover\Search as DiscoverSearch;
|
||||
use App\Livewire\Sites\Index as SitesIndex;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
Route::view('/', 'home')->name('home');
|
||||
@@ -13,15 +11,14 @@ Route::get('/sites', SitesIndex::class)->name('sites.index');
|
||||
Route::get('/sites/{site}', [SiteController::class, 'show'])->name('sites.show');
|
||||
Route::get('/discover', DiscoverSearch::class)->name('discover');
|
||||
|
||||
Route::middleware('guest')->group(function () {
|
||||
Route::get('/login', Login::class)->name('login');
|
||||
Route::get('/register', Register::class)->name('register');
|
||||
});
|
||||
Route::view('profile', 'profile')
|
||||
->middleware(['auth'])
|
||||
->name('profile');
|
||||
|
||||
Route::post('/logout', function () {
|
||||
Auth::logout();
|
||||
request()->session()->invalidate();
|
||||
request()->session()->regenerateToken();
|
||||
Route::post('/logout', function (Logout $logout) {
|
||||
$logout();
|
||||
|
||||
return redirect()->route('home');
|
||||
return redirect('/');
|
||||
})->middleware('auth')->name('logout');
|
||||
|
||||
require __DIR__.'/auth.php';
|
||||
|
||||
Reference in New Issue
Block a user