Tech Starlog

管理画面と公開ページの分離(Laravel)

投稿日:2026/01/04

前回の記事では、Laravel Breeze を使って管理画面用の認証機能を導入しました。
今回はその続きとして、管理画面(ログイン必須)と公開ページ(誰でも閲覧可)を分離する設計例を紹介します。

ブログや簡単な CMS を作成する場合、
「閲覧用のページ」と「管理・編集用のページ」を明確に分けておくことで、
セキュリティ面・保守性の両方を向上させることができます。


今回のゴール

本記事では、以下のような構成を想定します。

公開ページ(認証なし)

  • 一覧ページ
  • 詳細ページ
  • 誰でもアクセス可能

管理画面(認証必須)

  • コンテンツの作成・編集・削除
  • ログインユーザーのみアクセス可能
  • 管理画面専用のレイアウトを使用

ルーティング設計の考え方

まずは、URL と認証範囲を整理します。

公開ページ(認証なし)

  • /:一覧ページ
  • /items/{item}:詳細ページ

管理画面(認証必須)

  • /items/create:新規作成
  • /items/{item}/edit:編集
  • /items(POST):保存
  • /items/{item}(PUT / DELETE):更新・削除

管理画面用のルートは、authミドルウェアでまとめて保護します。


ルート定義の例

以下は、一般的な分離構成の一例です。

// 公開ページ
Route::get('/', [ItemController::class, 'index'])->name('items.index');

// 管理画面(認証必須)
Route::middleware('auth')->group(function () {
    Route::get('/items/create', [ItemController::class, 'create'])->name('items.create');
    Route::get('/items/{item}/edit', [ItemController::class, 'edit'])->name('items.edit');
    Route::post('/items', [ItemController::class, 'store'])->name('items.store');
    Route::put('/items/{item}', [ItemController::class, 'update'])->name('items.update');
    Route::delete('/items/{item}', [ItemController::class, 'destroy'])->name('items.destroy');
});

// 公開ページ
Route::get('/items/{item}', [ItemController::class, 'show'])->name('items.show');

コントローラ側での使い分け

同じControllerでも、 返すビューを用途別に分けることで役割を明確にできます。

public function index()
{
    $items = Item::latest()->get();
    return view('items.index', compact('items'));
}

public function edit(Item $item)
{
    return view('items.edit', compact('item'));
}

まとめ

  • 管理画面と公開ページは、ルーティングで分離する。
  • 認証範囲を明確にすることで、構成がシンプルになる。
  • 小規模なアプリケーションでも、初期段階で分けておくと後から困らない。