Header Ads

Header ADS

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

Theme images by fpm. Powered by Blogger.