ướng dẫn Controller Repository Service Model trong Laravel

Hướng dẫn triển khai cơ bản cho mô hình Controller - Repository - Service trong Laravel giúp bạn tổ chức mã nguồn một cách dễ quản lý và bảo trì. Dưới đây là một ví dụ cụ thể về cách bạn có thể triển khai cấu trúc này:

Model

Đây là nơi bạn định nghĩa các thuộc tính và phương thức tương tác với cơ sở dữ liệu. Laravel cung cấp cơ chế Eloquent ORM để làm việc với các model. Ví dụ, ta sẽ tạo một model cho bảng Posts:

// app/Models/Post.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    protected $fillable = ['title', 'content'];
}

Repository

Repository đóng vai trò trung gian giữa Controller và Model. Nó chứa các phương thức để thực hiện thao tác với cơ sở dữ liệu thông qua model. Điều này giúp tách biệt logic cơ sở dữ liệu khỏi controller và dễ dàng thay đổi hoặc thử nghiệm logic cơ sở dữ liệu.

// app/Repositories/PostRepository.php
namespace App\Repositories;

use App\Models\Post;

class PostRepository
{
    public function create($data)
    {
        return Post::create($data);
    }
    
    public function getAll()
    {
        return Post::all();
    }
    
    // Các phương thức khác tương tự
}

Service

Service chứa logic kinh doanh và giao tiếp với Repository. Controller sẽ gọi các phương thức từ Service để xử lý yêu cầu và trả về dữ liệu tương ứng. Điều này giúp tách biệt logic kinh doanh khỏi controller và giúp việc kiểm thử và bảo trì dễ dàng hơn.

// app/Services/PostService.php
namespace App\Services;

use App\Repositories\PostRepository;

class PostService
{
    protected $postRepository;
    
    public function __construct(PostRepository $postRepository)
    {
        $this->postRepository = $postRepository;
    }
    
    public function createPost($data)
    {
        return $this->postRepository->create($data);
    }
    
    public function getAllPosts()
    {
        return $this->postRepository->getAll();
    }
    
    // Các phương thức khác tương tự
}

Controller

Controller là nơi xử lý các yêu cầu từ người dùng, gọi các phương thức từ Service để lấy hoặc gửi dữ liệu và trả về kết quả cho người dùng.

// app/Http/Controllers/PostController.php
namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Services\PostService;

class PostController extends Controller
{
    protected $postService;
    
    public function __construct(PostService $postService)
    {
        $this->postService = $postService;
    }
    
    public function create(Request $request)
    {
        $data = $request->only(['title', 'content']);
        $post = $this->postService->createPost($data);
        // Xử lý response
    }
    
    public function index()
    {
        $posts = $this->postService->getAllPosts();
        // Xử lý response
    }
    
    // Các phương thức khác tương tự
}

Khi bạn áp dụng cấu trúc này, bạn có thể quản lý dễ dàng các phần khác nhau của ứng dụng Laravel một cách hiệu quả. Đồng thời, việc tách biệt logic kinh doanh, lưu trữ và giao tiếp giữa các lớp giúp mã nguồn của bạn trở nên linh hoạt, dễ bảo trì và kiểm thử.