<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\BlogPost;
use Illuminate\Http\Request;
use Illuminate\Support\Str;
class BlogController extends Controller
{
public function index()
{
$posts = BlogPost::latest()->paginate(20);
return view('admin.blog.index', compact('posts'));
}
public function create()
{
return view('admin.blog.create');
}
public function store(Request $request)
{
$data = $request->validate([
'title' => 'required|string|max:255',
'slug' => 'nullable|string|unique:blog_posts,slug',
'excerpt' => 'nullable|string',
'content' => 'required|string',
'image' => 'nullable|image|max:4096',
'status' => 'boolean',
'published_at' => 'nullable|date',
]);
$data['slug'] = $data['slug'] ?? Str::slug($data['title']);
$data['status'] = $request->boolean('status', false);
$data['published_at'] = $data['published_at'] ?? ($data['status'] ? now() : null);
if ($request->hasFile('image')) {
$data['image'] = $request->file('image')->store('blog', 'public');
}
BlogPost::create($data);
return redirect()->route('admin.blog.index')->with('success', 'Blog post published.');
}
public function edit(BlogPost $blog)
{
return view('admin.blog.edit', compact('blog'));
}
public function update(Request $request, BlogPost $blog)
{
$data = $request->validate([
'title' => 'required|string|max:255',
'slug' => 'nullable|string|unique:blog_posts,slug,' . $blog->id,
'excerpt' => 'nullable|string',
'content' => 'required|string',
'image' => 'nullable|image|max:4096',
'status' => 'boolean',
'published_at' => 'nullable|date',
]);
$data['slug'] = $data['slug'] ?? Str::slug($data['title']);
$data['status'] = $request->boolean('status', false);
if (!$blog->published_at && $data['status']) {
$data['published_at'] = now();
}
if ($request->hasFile('image')) {
$data['image'] = $request->file('image')->store('blog', 'public');
}
$blog->update($data);
return redirect()->route('admin.blog.index')->with('success', 'Blog post updated.');
}
public function destroy(BlogPost $blog)
{
$blog->delete();
return redirect()->route('admin.blog.index')->with('success', 'Blog post deleted.');
}
}