Trong bài viết này chúng ta sẽ thuộc khám phá về một vấn đề kể tới khá nhiều trong Laravel chính là Repository Pattern. Với phần đa các bạn new khám phá về Laravel chắc là cũng ít chú ý mang lại vấn đề này. Còn chúng ta đi thực tập trên các cửa hàng, những ban trainee thì chắc gặp mặt sẽ tiến hành các trainer của bản thân mình nói tới tự khóa này. Vậy nó là gì mà lại, bao gồm thực thụ cần thiết không, họ thuộc mày mò nhé.

Bạn đang xem: Repository pattern là gì

1. Khái niệm

trước hết để phát âm về khái niệm họ vẫn thuộc xem hình họa dưới đây

*

Repository Pattern là một biện pháp tổ chức triển khai source code vào Laravel.Nhìn vào hình ảnh này các ban có thể tưởng tượng qua qua nó rồi chđọng, Repository Pattern là lớp trung gian thân tầng Data Access cùng Business Logic, gọi môm na thì nó là lớp trung gian giữa việc truy cập tài liệu với cách xử trí logic. hỗ trợ cho bài toán truy cập tài liệu nghiêm ngặt cùng bảo mật thông tin hơn.

Bình hay để lấy dữ liệu gì đó hiển thị ra view thì chúng ta dễ dàng và đơn giản viết một Controller query mang đến Database để đưa ra tài liệu. Nhưng với Repository pattern như hình trên chúng ta thấy Repository nó nằm trong lòng, là trung gian giữa Controller cùng Model. Hiểu dễ dàng thì như vậy này, Lúc bao gồm request Call tới controller, controller hotline tới Repository rồi thằng này call cho tới Mã Sản Phẩm lấy data với cách xử trí, controller đem tài liệu thì chỉ việc hotline mang đến thằng này.Lí ttiết thì nói vậy thôi chứ còn để vận dụng nó vào dự án thì chúng ta sẽ xem ví dụ tiếp sau đây nhé

2. Sử dụng Repository pattern vào Laravel

Bây giờ trả sử bản thân bao gồm một lớp Post cùng những bạn có nhu cầu lấy ra danh sách thành phầm bố trí theo ID sút dần?

Đề bài bác khá là easy cần ko đơ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à dứt easy yêu cầu không, Còn nếu như viết theo Repository pattern thì bọn họ đã phải khởi tạo thêm một lớp là PostRepository vào một tlỗi mục tên là Repositories, tlỗi mục này vào app/

namespace AppRepositories;use AppModelsPost;class PostRepository public function getPostById() return Post::orderBy("id", "desc")->get(); Và trong PostController từ bây giờ bọn họ vẫn viết

class PostController extends Controller protected $postRepository; public function __construct(PostRepository $postRepository) $this->postRepository = $postRepository; public function getPost() $posts = $this->postRepository->getPostById(); return view("post.index", compact("posts")); Đến đây thì các các bạn sẽ trường đoản cú hỏi, sao lại yêu cầu mất công, sẽ từ một lớp mang dữ liệu ngon miệng lại phải viết thêm một tấm nữa ?? Dữ liệu mang ra cũng tương tự vậy chả khác gì, mà thuở đầu chỉ mất vài ba dòng code là đem được, giờ đồng hồ tốn thêm cả chục chiếc code nữa, vì sao lại buộc phải như vậy ??.

Mình Lúc new tò mò về repository cũng hỏi câu này nhều rồi

*
. Và bản thân chắc chắn là cũng một cơ số chúng ta nữa khi mới tò mò về repository cũng đã từng có lần tự gồm thắc mắc này.

Các chúng ta bao gồm thấy ko, theo cách viết không cần sử dụng repository thì Controller sẽ thêm chặt với thao tác làm việc trực tiếp new Model. Nếu khi mà lại Model có sự biến hóa giỏi tái cấu trúc bảng nào đấy ví dụ như cột title sống bảng posts chúng ta bắt buộc cầm cố lại là title_post ví dụ điển hình thì chúng ta đang gặp vấn đề Lúc cần tra cứu code trong Controller coi chỗ nào sử dụng đến địa điểm đó để sửa. Hoặc đau khổ rộng là, nhu cầu quý khách hàng biến hóa vào dòng ngày ttách nắng và nóng khổng lồ ông ấy đề xuất họ rước theo ID bớt dần nuốm tê, rồi vào một trời mưa gió to lớn ông ấy lại đề xuất rước theo lượng view bớt dần . Biết làm thế nào được bắt buộc chiều ý quý khách thôi.

Easy thôi, vào Controller tìm chỗ nào orderBy ID desc sửa thành orderBy view desc là chấm dứt. Nhưng vụ việc ở một dự án công trình họ sẽ sử dụng function đó các lần với có thể là trong nhiều Class khác nhau. khi đó thì bọn họ đang nên lần tìm các Class trong Controller coi chỗ nào bao gồm để sửa như vậy thì thừa mất thời gian, chưa kể trong những lúc sửa rủi ro xóa nhầm xuất xắc thêm giảm gì đó trong code hoặc sửa thiếu một vài ba địa điểm, rồi lại ngồi mò bug thì vô cùng phiền toái. Lúc này chính là thời điểm Repository phát huy tính năng.

Lúc viết theo repository thì dễ dàng và đơn giản chúng ta chỉ cần vào Repositories vừa tạo thành thời gian nãy search vị trí nên sửa, chỉ việc sửa một vị trí, các controller call cùng thực hiện repository này cũng biến thành thay đổi nlỗi mình ước muốn. Đến trên đây các bạn bước đầu thấy repository có lợi rồi buộc phải ko.

Xem thêm: Come On Là Gì - Come On, Come Up, Come Out, Come Across Là Gì

Chưa hết đâu. Tiếp nhé, giờ không nắng cũng ko mưa nữa rồi, trời bắt đầu gồm gió thì ông khách hàng tê lại đưa ra yêu cầu là sử dụng MongoDB hoặc Redis nhằm lưa dữ liệu . Thôi đành chiều ý ông kia vậy. Chúng ta đang phải tra cứu PostRepository vừa rồi và đổi lại thành những PostRepositoryRedis tuyệt PostRepositoryMongo... Ok, không sao sửa thôi,sửa ngừng vài ba ngày thì thì ông cơ lại ko lại ao ước quay trở lại như cũ. Đến đây là gồm sự việc rồi. Vậy giải pháp là gì?

Để giải quyết vụ việc bên trên họ sẽ tạo nên ra một Interface thông thường cho các một số loại repositories. Để có tác dụng được điều này chúng ra sẽ tạo nên thêm 1 thư mục là Contracts và bên trong sinh sản thêm một thư mục thương hiệu là Repositories để viết Interface phổ biến nlỗi đang nói trên vào kia, sau đó tạo nên một interface tên là PostRepositoryInterface làm việc trong những số ấy. Tên mình đặt cơ là không cần nhé những bạn cũng có thể đánh tên không giống. Hoặc viết thỏng mục Contracts bên phía trong thỏng mục Repositories chế tạo ban sơ cũng rất được. Tất nhiên là với một dự án công trình thì bọn họ bắt buộc kiến thiết những Interface ví dụ này mình desgin mang đến Post. ví dụ như một blog thì bọn họ còn buộc phải thiết kế Interface mang đến Tag, Question... các Interface này vẫn đặt không còn vào AppContractsRepositories nhé.

namespace AppContractsRepositories;interface PostRepositoryInterface public function getPostById(); ...Và bây chừ bọn họ sẽ có 1 interface nhỏng một khuôn chủng loại bọn chúng để cho các Repositories ngơi nghỉ bên trên implement. Nếu vào project bọn họ bao gồm không chỉ là PostRepositoryInterface mà lại còn có những Interface khác ví như TagRepositoryInterface, QuestionRepositoryInterface. Và chúng ta nhận ra là trong những Interface này còn có đa số function tương tự như nhau nhỏng all(), update(), create().... Các function mà lại Interface nào thì cũng thấy gồm thì các bạn buộc phải kiến tạo một Interface chung để knhì báo các hàm bình thường trong những số ấy, cùng lúc này PostRepositoryInterface, TagRepositoryInterface, QuestionRepositoryInterface sẽ extend trường đoản cú dòng Interface tầm thường vừa nói trên đặt nó là AbstractRepositoryInterface

namespace AppContractsRepositories;interface AbstractRepositoryInterface public function model(); public function all(); public function store(array $data); public function show($id); public function edit($id); ....Và giả dụ bắt buộc một function riêng biệt làm sao đó không tồn tại trong AbstractRepositoryInterface thì họ chỉ cần khai báo thêm trong các Interface extend

namespace AppContractsRepositories;interface PostRepositoryInterface extends AbstractRepositoryInterface public function pending($id); public function getTags($id); .....Trong thời điểm này thì PostRepository họ vừa viết thời gian nãy sẽ implements trường đoản cú PostRepositoryInterface sẽ phải tất cả chút ít biến hóa nlỗi sau

namespace AppRepositories;​use AppModelsPost;​class PostRepository implements PostRepositoryInterface{ //override public function getPostById() return Post::orderBy("id", "desc")->get(); Redis giỏi Mongo thì tựa như cũng trở nên implements trường đoản cú PostRepositoryInterface.Và bây chừ trong PostsController chúng ta sẽ cố kỉnh đổi

class PostsController extends Controller protected $postRepository; public function __construct(PostRepositoryInterface $postRepository) $this->PostRepository = $postRepository; public function getPost() $post = $this->postRepository->getPostById(); return $post; Nhớ thêm namspaces PostRepositoryInterface nữa nhé.

Các các bạn bao gồm phân biệt điều gì không, khi bọn họ biến đổi PostsController cố kỉnh kia thì Lúc chạy kiên cố dĩ nhiên có khả năng sẽ bị báo lỗi bởi vì PostRepositoryInterface là một trong Interface và tất yếu Interface thì cần yếu tạo nên instance được, họ thiết yếu inject Interface vào Controller. Nhưng với Laravel thì được đấy, với Service container nó hoàn toàn có thể góp bọn họ bind một interface vào một trong những implement của chính nó. Các bạn cũng có thể tìm hiểu Service container cùng Denpendency Injection nhằm hiểu rõ rộng các thao tác của chính nó nhé.

Tiếp theo bọn họ đề nghị vào tlỗi mục Providers với tìm đến AppServiceProvider nhằm đăng kí. Trong cách làm register() bọn họ vẫn thêm.

public function register() $this->app->bind( "AppContractsRepositoriesPostRepositoryInterface", "AppRepositoriesPostRepository" );Vậy nên là bọn họ sẽ đăng kí xong xuôi cùng hoàn toàn có thể inject PostRepositoryInterface vào PostController. Nếu dự án công trình bọn họ cần bind những Interface thì tốt nhất có thể là nên tạo ra một file riêng rẽ vào app/Providers chứ không cần độc nhất vô nhị thiết đề xuất cần sử dụng AppServiceProvider. Nếu dung cách tạo thành tệp tin mới, thì bắt buộc knhị báo file đó config/ứng dụng.php cùng sản xuất providers nhé

"providers" => <... AppProvidersRepositoryServiceProvider::class,>,Quay trở lại cùng với PostController tiếng thì PostController của chúng ta sẽ chỉ thao tác làm việc với PostRepositoryInterface, các bạn sẽ thấy lợi ích của Repository Pattern rồi chứ đọng. Trong PostRepositoryInterface bọn họ sẽ xây dựng dựng rất nhiều phương thức bình thường cho những Repostories implements nhằm thực hiện bọn chúng, trong Controller thì họ sẽ thực hiện điện thoại tư vấn nlỗi bên trên để lấy dữ liệu.

Vậy là qua bài bác này mình đã giới thiệu kết thúc mang lại các bạn về Repository Pattern vào Laravel. Hy vọng có thể góp các bạn đang mong mày mò và ý muốn clean code rất có thể phần nào phát âm được cùng vận dụng.

link tsi mê khảo:

https://infobandarpkr.com/p/laravel-design-patterns-series-repository-pattern-part-3-ogBG2l1ZRxnLhttps://infobandarpkr.com/p/tim-hieu-ve-service-container-trong-laravel-Qbq5QLw3lD8http://phpviet.net/repository-pattern-trong-laravel/