Sử dụng Repository trong Laravel

Tram Ho

Repository Pattern rất hữu ích trong Laravel , nó giúp chúng ta dễ dàng maintain code, và giảm thiểu được việc xử lý logic trong Controller. Repository là một abstraction, tức là nó tạo một layer ở giữa việc xử lý logic và database trong ứng dụng.

Repository được sử dụng để giải quyết sự tách biệt khi triển khai một ứng dụng, điều này rất quan trọng khi viết code giúp chúng ta dễ dàng maintain. Chẳng hạn, khi ứng dụng của chúng ta đang sử dụng MySQL và muốn đổi sang MongoDB. Vì chúng ta sử dụng Repository Pattern nên, mọi logic trong ứng dụng của chúng ta được giữ nguyên và tất cả những gì chúng ta phải làm là thay đổi repository mà thôi. Nghe có vẻ dễ dàng hơn rồi phải không nào! 😀

Hãy cùng xem 1 ví dụ đơn giản sau để hiểu rõ hơn nhé:

Bước 1: Tạo một Repository Interface

Chúng ta cần 1 interface để hoạt động như một contract cho các repository. Vậy contract là gì?

Contract đơn giản giống như một bản hợp đồng bằng văn bản mô tả một công việc cụ thể, ở đây nó chính là interface.

Tạo một folder bên trong folder app đặt tên là Repositories.

Sau đó tạo 1 file PostRepositoryInterface.php.

Đây là Interface mà chúng ta sẽ sử dụng. Bên trong interface này, bạn add vào đoạn code sau:

Bây giờ, chúng ta cần thêm các contract hoặc các method để PostRepository có thể implement sau này:

Chú ý rằng sẽ không có đóng và mở ngoặc nhọn {}, bởi vì chúng ta không triển khai hàm trong interface ( nếu bạn nào quên có thể xem lại các tính chất trong lập trình hướng đối tượng OOP), do đó sẽ không có việc xử lý logic nằm trong interface, các method chỉ được phép khai báo.

Bước 2: Tạo Repository

Chúng ta bắt đầu tạo các class. Bên trong folder Repositories tạo file PostRepository.php Class này sẽ implement lại interface PostRepositoryInterface mà chúng ta vừa tạo ở Bước 1.

Code trong file PostRepository.php như sau:

Tiếp theo, vẫn trong file PostRepository.php, chúng ta bắt buộc phải tạo các method được khai báo trong interface và triển khai chúng, nếu không sẽ gặp lỗi trong quá trình chạy và sẽ không sử dụng được class mà ta vừa tạo ra.

Ở đây chúng ta sẽ sử dụng Eloquent model Post, vì vậy chúng ta phải khai báo để sử dụng:

Chỉnh sửa PostRepository.php như sau:

Như vậy, chúng ta đã tạo được 1 interface và 1 class sử dụng interface đó. Bây giờ, chúng ta cần phải đăng ký repository với container trong Laravel

Bước 3: Khai báo Repository với Laravel IoC Container

Tạo một file BackendServiceProvider.php bên trong thư mục Repositories. File này đống vai trò như một kết nối tới Laravel IoC Container và cho phép chúng ta sử dụng dependency injection để thêm vào các interface repository của chúng ta.

Code trong BackendServiceProvider.php:

Một điều chú ý ở đây là thứ tự giữa interfaceclass, bạn phải để interface trước class mà bạn sử dụng, ở ví dụ này, nếu bạn thử đặt AppRepositoriesPostRepository trước AppRepositoriesPostRepositoryInterface thì sẽ gặp lỗi, bắt buộc bạn phải bind interface trước.

Sau các bước trên, chúng ta sẽ có một cấu trúc thư mục và các file như sau:

Bước 4: Sử dụng Repository trong Controller

Chúng ta bắt đầu sử dụng repository, ở đây giả sử chúng ta đã có 1 controllerPostController.php và controller này xử lý mọi thứ liên quan đến Post của bạn.

Việc chúng ta phải làm là thêm interface vào trong controlller thông qua constructor khi controller được khởi tạo. Bằng cách này chúng ta có thể sử dụng repository cho các tương tác với posts model:

Việc đầu tiên chúng ta thêm PostRepositoryInterface vào constructor

Sau đó, chúng ta đặt một biến $post thành một instance của object PostRepository thông qua interface. Điều này cho phép chúng ta gọi các phương thức trong PostRepository giống như chúng ta sử dụng với phương thức index(), các bạn có thể thấy:

Điều này ngăn việc truy cập trực tiếp vào model giống như Post::find($id), và nó thêm cho chúng ta một lớp trừu tượng vào bên trong ứng dụng.

Ở đầu bài viết, chúng ta từng đề cập tới việc ngừng sử dụng MySQL và sử dụng MongoDB để thay thế, hay bất kì một công nghệ nào khác, tất cả những điều cần phải làm là chỉ việc thay đổi logic của PostRepository.

Điều đó có nghĩa rằng code trong controller chúng ta không cần phải thay đổi gì. 😃

Bước 5: Sử dụng nhiều Repository hơn

Trong một ứng dụng bạn có thể thêm nhiều Repository khác nhau. Tất cả việc bạn cần làm là tạo một interface và sau đó tạo repository, sau đó đăng ký chúng với Laravel IoC Container trong Service Provider.

Ví dụ, chúng ta thêm một **Comment Repository **

Trong thư mục app:

Tạo một CommentRepositoryInterface tương tự với việc tạo PostRepositoryInterface ở các bước trước.

CommentRepositoryInterface.php

CommentRepository.php

Cuối cùng là khai báo nó trong IoC Container bên trong BackendServiceProvider.php.

Trên đây là tìm hiểu của mình về Repository trong Laravel. Hy vọng nó có thể giúp ích được các bạn! 😄😄

Chia sẻ bài viết ngay

Nguồn bài viết : Viblo