관리자 카테고리 관리
카테고리 관리는 아래 컨트롤러가 담당합니다.
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/categories | GET | index() | 목록 + 생성 폼 |
/admin/categories | POST | store() | 생성 |
/admin/categories/{category} | PUT/PATCH | update() | 수정 |
/admin/categories/{category} | DELETE | destroy() | 삭제 |
카테고리 목록
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_id를 null로 바꿉니다.
Laravel 카테고리 삭제
-> Laravel 카테고리에 있던 글들은 카테고리 없음 상태
-> 글 본문과 제목은 그대로 유지
화면 파일
카테고리 관리 화면은 이 파일입니다.
resources/views/admin/categories/index.blade.php
한 화면 안에 세 기능이 모두 있습니다.
- 새 카테고리 생성 폼
- 기존 카테고리 수정 폼
- 카테고리 삭제 버튼
그래서 별도의 create.blade.php, edit.blade.php가 없습니다.