name('admin.')->group(function () { Route::get('login', [AuthController::class, 'showLoginForm'])->name('login'); Route::post('login', [AuthController::class, 'login'])->middleware('throttle:5,1'); Route::middleware('admin.auth')->group(function () { Route::get('/', [DashboardController::class, 'index'])->name('dashboard'); Route::post('logout', [AuthController::class, 'logout'])->name('logout'); Route::resource('posts', AdminPostController::class)->except(['show']); Route::post('posts/{post}/duplicate', [AdminPostController::class, 'duplicate'])->name('posts.duplicate'); Route::resource('settings/channels', ChannelController::class)->names('settings.channels')->except(['show']); Route::resource('settings/prefixes', PrefixController::class)->names('settings.prefixes')->only(['index', 'store', 'destroy']); Route::resource('settings/users', AdminUserController::class)->names('settings.users')->except(['show']); Route::resource('taxonomy', TaxonomyTermController::class)->names('taxonomy')->parameters(['taxonomy' => 'term'])->except(['show']); Route::post('channel/activate', [ChannelController::class, 'activate'])->name('channel.activate'); }); }); Route::middleware('resolve.channel')->group(function () { Route::get('/', [HomeController::class, 'index'])->name('home'); // Specific named routes before the catch-all Route::get('sitemap.xml', [\App\Http\Controllers\SitemapController::class, 'index'])->name('sitemap'); Route::get('feed.xml', [\App\Http\Controllers\FeedController::class, 'index'])->name('feed'); // Taxonomy: /{taxonomy_prefix}/{term-slug} // Post index: /{prefix} // Post show: /{prefix}/{slug} // All resolved dynamically in controllers based on channel's prefixes Route::get('{prefix}/{slug}', [PostController::class, 'show'])->name('post.show'); Route::get('{prefix}', [PostController::class, 'index'])->name('post.index'); });