13/09/2018, 15:00

Repository Pattern là gì ? Sử dụng Repository Pattern trong Laravel

Trong bài viết này chúng ta sẽ cùng tìm hiểu về một vấn đề nói đến khá nhiều trong Laravel đó là Repository Pattern. Với những bạn mới tìm hiểu về Laravel chắc là cũng ít để ý đến vấn đề này. Còn các bạn đi thực tập tại các công ty, các ban trainee thì chắc gặp sẽ được các trainer của mình nói đến ...

Trong bài viết này chúng ta sẽ cùng tìm hiểu về một vấn đề nói đến khá nhiều trong Laravel đó là Repository Pattern. Với những bạn mới tìm hiểu về Laravel chắc là cũng ít để ý đến vấn đề này. Còn các bạn đi thực tập tại các công ty, các ban trainee thì chắc gặp sẽ được các trainer của mình nói đến từ khóa này. Vậy nó là gì mà, có thực sự cần thiết không, chúng ta cùng tìm hiểu nhé.

1. Khái niệm

Đầu tiên để hiểu về khái niệm chúng ta sẽ cùng xem ảnh dưới đây

Repository Pattern là một cách tổ chức source code trong Laravel. Nhìn vào ảnh này các ban có thể hình dung qua qua nó rồi chứ, Repository Pattern là lớp trung gian giữa tầng Data Access và Business Logic, hiểu môm na thì nó là lớp trung gian giữa việc truy cập dữ liệu và xử lý logic. giúp cho việc truy cập dữ liệu chặt chẽ và bảo mật hơn.

Bình thường để lấy dữ liệu gì đó hiển thị ra view thì chúng ta đơn giản viết một Controller query đến Database để lấy ra dữ liệu. Nhưng với Repository pattern như hình trên chúng ta thấy Repository nó nằm giữa, là trung gian giữa Controller và Model. Hiểu đơn giản thì như thế này, khi có request gọi tới controller, controller gọi tới Repository rồi thằng này gọi tới model lấy data và xử lý, controller lấy dữ liệu thì chỉ việc gọi đến thằng này. Lí thuyết thì nói vậy thôi chứ còn để áp dụng nó vào dự án thì chúng ta sẽ xem ví dụ dưới đây nhé

2. Sử dụng Repository pattern trong Laravel

Bây giờ giả sử mình có một lớp Post và các bạn muốn lấy ra danh sách sản phẩm sắp xếp theo ID giảm dần?

Đề bài khá là easy phải không đơn giản là vào PostController viết một hàm

public function getPost()
{
    $posts = Post::orderBy('id', 'desc')->get();

    return view('post.index', compact('posts'));
}

Vậy là xong easy phải không, Còn nếu viết theo Repository pattern thì chúng ta sẽ phải tạo thêm một lớp là PostRepositoryEloquent trong một thư mục tên là Repositories, thư mục này trong app/

namespace AppRepositories;

use AppModelsPost;

class PostRepositoryEloquent
{
    public function getPostById()
    {
        return Post::orderBy('id', 'desc')->get();
    }
}

Và trong PostController lúc này chúng ta sẽ viết

class PostController extends Controller
{
    protected $postRepository;

    public function __construct(PostRepositoryElquent $postRepository)
    {
        $this->postRepository = $postRepository;
    }
    
    public function getPost()
    {
        $posts = $this->postRepository->getPostById();

        return view('post.index', compact('posts'));
    }
}

Đến đây thì các bạn sẽ tự hỏi, sao lại phải mất công, đang từ một lớp lấy dữ liệu ngon lành lại phải viết thêm một lớp nữa ?? Dữ liệu lấy ra cũng như vậy chả khác gì, tại sao lại phải như vậy ??.

Mình khi mới tìm hiểu về repository cũng hỏi câu này nhều rồi             </div>
            
            <div class=

0