with(['category']) ->when($request->filled('q'), function ($query) use ($request): void { $query->whereFullText(['title', 'excerpt', 'body'], (string) $request->string('q')); }) ->latest('updated_at') ->paginate(20) ->withQueryString(); return view('admin.guides.index', [ 'items' => $items, 'filters' => $request->only(['q']), ]); } public function create(): View { return view('admin.guides.form', [ 'item' => new Guide(), 'categories' => Category::query()->where('type', 'guide')->orderBy('name')->get(), 'statusOptions' => EntityStatus::cases(), 'submitRoute' => route('admin.guides.store'), 'method' => 'POST', ]); } public function store(GuideRequest $request): RedirectResponse { $item = Guide::query()->create($this->normalizePayload($request->validated())); $this->changeLogService->log('created', $item); return redirect()->route('admin.guides.edit', $item)->with('status', '教程已创建'); } public function edit(Guide $guide): View { return view('admin.guides.form', [ 'item' => $guide, 'categories' => Category::query()->where('type', 'guide')->orderBy('name')->get(), 'statusOptions' => EntityStatus::cases(), 'submitRoute' => route('admin.guides.update', $guide), 'method' => 'PUT', ]); } public function update(GuideRequest $request, Guide $guide): RedirectResponse { $before = $guide->getAttributes(); $guide->fill($this->normalizePayload($request->validated())); $guide->save(); $this->changeLogService->log('updated', $guide, $before); return redirect()->route('admin.guides.edit', $guide)->with('status', '教程已更新'); } public function publish(Guide $guide): RedirectResponse { $before = $guide->getAttributes(); $guide->status = EntityStatus::Published; $guide->published_at = $guide->published_at ?? now(); $guide->save(); $this->changeLogService->log('published', $guide, $before); return redirect()->route('admin.guides.edit', $guide)->with('status', '教程已发布'); } private function normalizePayload(array $data): array { if (($data['status'] ?? null) === EntityStatus::Published->value && empty($data['published_at'])) { $data['published_at'] = now(); } return $data; } }