본문으로 건너뛰기

관리자 카테고리 관리

카테고리 관리는 아래 컨트롤러가 담당합니다.

app/Http/Controllers/Admin/CategoryController.php

카테고리는 글을 주제별로 묶는 분류입니다.
예를 들어 Laravel, JavaScript, 배포 같은 이름을 가질 수 있습니다.

라우트

Route::resource('categories', \App\Http\Controllers\Admin\CategoryController::class)
->only(['index', 'store', 'update', 'destroy']);

카테고리는 별도의 작성/수정 페이지 없이 한 화면에서 관리합니다.
그래서 resource 라우트 중 일부만 사용합니다.

URL메서드함수역할
/admin/categoriesGETindex()목록 + 생성 폼
/admin/categoriesPOSTstore()생성
/admin/categories/{category}PUT/PATCHupdate()수정
/admin/categories/{category}DELETEdestroy()삭제

카테고리 목록

public function index()
{
$categories = Category::withCount('posts')->orderBy('name')->get();

return view('admin.categories.index', compact('categories'));
}

withCount('posts')는 각 카테고리에 연결된 글 수를 계산합니다.

Blade에서는 이렇게 사용합니다.

{{ $category->posts_count }}

관리자 화면의 글 수는 공개/비공개를 구분하지 않고 전체 연결 글 수입니다.

카테고리 생성

public function store(Request $request)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255', 'unique:categories,name'],
'description' => ['nullable', 'string', 'max:1000'],
]);

Category::create([
'name' => $validated['name'],
'slug' => Str::slug($validated['name']).'-'.time(),
'description' => $validated['description'] ?? null,
]);
}

유효성 검사

'name' => ['required', 'string', 'max:255', 'unique:categories,name']

카테고리 이름은 필수이며, 이미 같은 이름이 있으면 안 됩니다.

'description' => ['nullable', 'string', 'max:1000']

설명은 비워도 됩니다. 하지만 입력한다면 문자열이고 최대 1000자입니다.

slug 생성

'slug' => Str::slug($validated['name']).'-'.time()

카테고리 이름을 URL용 문자열로 만들고 뒤에 시간을 붙입니다.

카테고리 이름이 Laravel이면 URL은 대략 이렇게 됩니다.

/categories/laravel-1710000000

카테고리 수정

public function update(Request $request, Category $category)
{
$validated = $request->validate([
'name' => ['required', 'string', 'max:255', Rule::unique('categories', 'name')->ignore($category->id)],
'description' => ['nullable', 'string', 'max:1000'],
]);

$category->update([
'name' => $validated['name'],
'description' => $validated['description'] ?? null,
]);
}

수정할 때 핵심은 이 부분입니다.

Rule::unique('categories', 'name')->ignore($category->id)

자기 자신의 이름은 중복 검사에서 제외합니다.
이 코드가 없으면 이름을 그대로 두고 설명만 바꾸려고 해도 "이미 있는 이름"으로 막힐 수 있습니다.

카테고리 삭제

public function destroy(Category $category)
{
$category->posts()->update(['category_id' => null]);
$category->delete();
}

카테고리를 삭제해도 글은 삭제하지 않습니다.
대신 그 카테고리에 연결된 글들의 category_idnull로 바꿉니다.

Laravel 카테고리 삭제
-> Laravel 카테고리에 있던 글들은 카테고리 없음 상태
-> 글 본문과 제목은 그대로 유지

화면 파일

카테고리 관리 화면은 이 파일입니다.

resources/views/admin/categories/index.blade.php

한 화면 안에 세 기능이 모두 있습니다.

  1. 새 카테고리 생성 폼
  2. 기존 카테고리 수정 폼
  3. 카테고리 삭제 버튼

그래서 별도의 create.blade.php, edit.blade.php가 없습니다.