Blog API CRUD functionality with a repository pattern in Laravel
1. Create a BlogRepository Interface
Define an interface for the Blog repository to establish a contract for the repository methods.
<?php
namespace App\Repositories;
interface BlogRepositoryInterface
{
public function getAllBlogs();
public function getBlogById($id);
public function getBlogBySlug($slug);
public function createBlog(array $data);
public function updateBlog($id, array $data);
public function deleteBlog($id);
}
2. Create a BlogRepository Implementation
Implement the interface in the BlogRepository.
<?php
namespace App\Repositories;
use App\Models\Blog;
class BlogRepository implements BlogRepositoryInterface
{
public function getAllBlogs()
{
return Blog::with(['user', 'category'])->paginate(10);
}
public function getBlogById($id)
{
return Blog::with(['user', 'category'])->findOrFail($id);
}
public function getBlogBySlug($slug)
{
return Blog::with(['user', 'category'])->where('slug', $slug)->firstOrFail();
}
public function createBlog(array $data)
{
return Blog::create($data);
}
public function updateBlog($id, array $data)
{
$blog = Blog::findOrFail($id);
$blog->update($data);
return $blog;
}
public function deleteBlog($id)
{
$blog = Blog::findOrFail($id);
return $blog->delete();
}
}
3. Register the Repository in the Service Container
Bind the interface to the repository in the AppServiceProvider.
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Repositories\BlogRepositoryInterface;
use App\Repositories\BlogRepository;
class AppServiceProvider extends ServiceProvider
{
public function register()
{
$this->app->bind(BlogRepositoryInterface::class, BlogRepository::class);
}
}
4. Update the BlogController
Modify the BlogController to use the repository.
<?php
namespace App\Http\Controllers\Seller;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Repositories\BlogRepositoryInterface;
class BlogController extends Controller
{
private $blogRepository;
public function __construct(BlogRepositoryInterface $blogRepository)
{
$this->blogRepository = $blogRepository;
}
public function index()
{
$blogs = $this->blogRepository->getAllBlogs();
return response()->json($blogs);
}
public function show($id)
{
$blog = $this->blogRepository->getBlogById($id);
return response()->json($blog);
}
public function store(Request $request)
{
$validated = $request->validate([
'title' => 'required|string|max:255',
'slug' => 'required|string|unique:blogs,slug',
'content' => 'required',
'category_id' => 'required|exists:categories,id',
'image' => 'required|string',
'status' => 'required|in:active,inactive',
]);
$blog = $this->blogRepository->createBlog($validated);
return response()->json($blog, 201);
}
public function update(Request $request, $id)
{
$validated = $request->validate([
'title' => 'sometimes|string|max:255',
'slug' => 'sometimes|string|unique:blogs,slug,' . $id,
'content' => 'sometimes',
'category_id' => 'sometimes|exists:categories,id',
'image' => 'sometimes|string',
'status' => 'sometimes|in:active,inactive',
]);
$blog = $this->blogRepository->updateBlog($id, $validated);
return response()->json($blog);
}
public function destroy($id)
{
$this->blogRepository->deleteBlog($id);
return response()->json(['message' => 'Blog deleted successfully']);
}
public function showBySlug($slug)
{
$blog = $this->blogRepository->getBlogBySlug($slug);
return response()->json($blog);
}
}
5. Update Routes
Add a route to fetch blogs by slug.
Route::group(['prefix' => 'seller', 'middleware' => 'auth:sanctum'], function () {
Route::resource('/blog', BlogController::class);
Route::get('/blog/slug/{slug}', [BlogController::class, 'showBySlug']);
});
No comments