Repository pattern là gì

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

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

1. Khái niệm

trước hết nhằm đọc về định nghĩa họ sẽ thuộc coi ảnh dưới đây

*

Repository Pattern là 1 trong phương pháp tổ chức triển khai source code trong Laravel.Nhìn vào hình họa 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, phát âm môm na thì nó là lớp trung gian giữa các việc truy cập tài liệu cùng cách xử lý súc tích. hỗ trợ cho Việc truy cập tài liệu ngặt nghèo cùng bảo mật thông tin hơn.

Bình thường để lấy dữ liệu nào đó hiển thị ra view thì bọn họ dễ dàng và đơn giản viết một Controller query đến Database để đưa ra tài liệu. Nhưng cùng với Repository pattern nhỏng hình bên trên chúng ta thấy Repository nó nằm giữa, là trung gian thân Controller và Model. Hiểu đơn giản thì như thế này, Khi có request hotline tới controller, controller điện thoại tư vấn tới Repository rồi thằng này Gọi tới Model mang data cùng xử trí, controller lấy dữ liệu thì chỉ việc Điện thoại tư vấn đến thằng này.Lí tmáu thì nói vậy thôi chứ đọng còn nhằm áp dụng nó vào dự án thì chúng ta vẫn coi ví dụ sau đây nhé

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

Bây tiếng đưa sử mình gồm một tờ Post và những bạn có nhu cầu lôi ra list sản phẩm sắp xếp theo ID bớt dần?

Đề bài bác tương đối là easy buộc phải ko đơn giản và dễ dàng 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à kết thúc easy bắt buộc không, Còn nếu như viết theo Repository pattern thì chúng ta sẽ phải tạo lập thêm một tấm là PostRepository vào một thư mục thương hiệu là Repositories, thỏng mục này vào app/

namespace AppRepositories;use AppModelsPost;class PostRepository public function getPostById() return Post::orderBy("id", "desc")->get(); Và vào PostController lúc này bọn họ sẽ 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 trên đây thì những các bạn sẽ trường đoản cú hỏi, sao lại buộc phải mất công, đã từ 1 lớp lấy tài liệu ngon cơm lại nên viết thêm một tờ nữa ?? Dữ liệu kéo ra cũng giống như vậy chả khác gì, nhưng ban sơ chỉ mất vài dòng code là lấy được, tiếng tốn thêm cả chục loại code nữa, tại vì sao lại bắt buộc như thế ??.

Mình lúc mới khám phá về repository cũng hỏi câu này nhều rồi

*
. Và mình chắc chắn là cũng một cơ số chúng ta nữa khi bắt đầu mày mò về repository cũng đã từng trường đoản cú gồm câu hỏi này.

Các chúng ta gồm thấy không, Theo phong cách viết ko cần sử dụng repository thì Controller vẫn đính thêm chặt với làm việc trực tiếp bắt đầu Mã Sản Phẩm. Nếu khi nhưng mà Model gồm sự biến đổi hay tái cấu trúc bảng nào đấy ví dụ như cột title ở bảng posts chúng ta nên cố gắng lại là title_post chẳng hạn thì họ đang chạm mặt băn khoăn khi nên tìm code vào Controller xem ở đâu dùng cho nơi đó nhằm sửa. Hoặc đau khổ rộng là, yêu cầu khách hàng thay đổi vào cái ngày ttách nắng và nóng khổng lồ ông ấy thưởng thức chúng ta rước theo ID sút dần dần nuốm kia, rồi vào một ngày mưa gió to lớn ông ấy lại yêu cầu mang theo lượng xem bớt dần dần . Biết làm sao được nên chiều ý khách hàng thôi.

Easy thôi, vào Controller tìm chỗ nào orderBy ID desc sửa thành orderBy view desc là dứt. Nhưng vụ việc tại một dự án công trình chúng ta đang sử dụng function đó các lần với rất có thể là trong vô số nhiều Class khác nhau. Khi kia thì chúng ta đang nên lần dò các Class trong Controller xem ở đâu gồm để sửa điều này thì quá mất thời gian, chưa tính trong khi sửa rủi ro xóa nhầm xuất xắc thêm sút nào đó vào code hoặc sửa thiếu hụt một vài địa điểm, rồi lại ngồi mò bug thì cực kỳ phiền phức. Lúc bấy giờ chính là cơ hội Repository đẩy mạnh chức năng.

Khi viết theo repository thì dễ dàng các bạn chỉ việc vào Repositories vừa chế tạo lúc nãy search chỗ bắt buộc sửa, chỉ việc sửa một khu vực, những controller call cùng thực hiện repository này cũng trở thành biến hóa như mình mong muốn. Đến trên đây chúng ta bước đầu thấy repository hữu dụng rồi đề nghị không.

Xem thêm: Đánh Giá Lenovo K5 Plus - Lenovo Vibe K5 Plus Review

Chưa hết đâu. Tiếp nhé, giờ ko nắng và nóng cũng không mưa nữa rồi, ttách ban đầu có gió thì ông quý khách hàng cơ lại chỉ dẫn thưởng thức là dùng MongoDB hoặc Redis để lưa dữ liệu . Thôi đành chiều ý ông kia vậy. Chúng ta sẽ phải tra cứu PostRepository vừa rồi với thay đổi lại thành những PostRepositoryRedis xuất xắc PostRepositoryMongo... Ok, ko có gì sửa thôi,sửa xong xuôi vài ngày thì thì ông kia lại không lại mong mỏi quay lại nlỗi cũ. Đến đây là tất cả vụ việc rồi. Vậy giải pháp là gì?

Để giải quyết sự việc bên trên bọn họ sẽ tạo ra một Interface phổ biến cho những các loại repositories. Để có tác dụng được vấn đề đó bọn chúng ra sẽ tạo thêm một thỏng mục là Contracts và bên trong tạo nên thêm một thỏng mục tên là Repositories để viết Interface chung như đã nói trên vào kia, kế tiếp sản xuất một interface thương hiệu là PostRepositoryInterface ngơi nghỉ trong số đó. Tên mình đặt kia là ko cần nhé những chúng ta có thể đặt tên không giống. Hoặc viết tlỗi mục Contracts bên trong thư mục Repositories chế tạo ra lúc đầu cũng khá được. Tất nhiên là với 1 dự án công trình thì bọn họ đề xuất tạo ra nhiều Interface ví dụ này bản thân chế tạo đến Post. ví dụ như một blog thì họ còn nên tạo Interface mang đến Tag, Question... các Interface này vẫn đặt hết trong AppContractsRepositories nhé.

namespace AppContractsRepositories;interface PostRepositoryInterface public function getPostById(); ...Và hiện nay họ đã có 1 interface nlỗi một khuôn mẫu mã bọn chúng khiến cho các Repositories nghỉ ngơi bên trên implement. Nếu vào project bọn họ gồm không chỉ PostRepositoryInterface nhưng mà còn tồn tại các Interface khác như TagRepositoryInterface, QuestionRepositoryInterface. Và chúng ta phân biệt là trong những Interface này còn có phần đa function tương tự nhau như all(), update(), create().... Các function nhưng mà Interface nào thì cũng thấy bao gồm thì các bạn bắt buộc thành lập một Interface chung nhằm knhì báo những hàm tầm thường trong những số đó, với từ bây giờ PostRepositoryInterface, TagRepositoryInterface, QuestionRepositoryInterface sẽ extend từ bỏ cái Interface phổ biến 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à nếu như đề xuất một function riêng rẽ nào kia không tồn tại trong AbstractRepositoryInterface thì họ chỉ cần knhị báo thêm trong các Interface extend

namespace AppContractsRepositories;interface PostRepositoryInterface extends AbstractRepositoryInterface public function pending($id); public function getTags($id); .....Lúc này thì PostRepository bọn họ vừa viết cơ hội nãy đã implements trường đoản cú PostRepositoryInterface sẽ buộc phải bao gồm chút ít biến hóa như sau

namespace AppRepositories;​use AppModelsPost;​class PostRepository implements PostRepositoryInterface{ //override public function getPostById() return Post::orderBy("id", "desc")->get(); Redis tuyệt Mongo thì tương tự cũng biến thành implements từ bỏ PostRepositoryInterface.Và hiện thời vào PostsController chúng ta sẽ nắm đổ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 đấy.

Các chúng ta bao gồm nhận biết điều gì ko, Lúc họ đổi khác PostsController cố kia thì lúc chạy kiên cố chắc chắn có khả năng sẽ bị báo lỗi vì PostRepositoryInterface là một trong những Interface cùng tất yếu Interface thì tất yêu sản xuất instance được, bọn họ quan trọng inject Interface vào Controller. Nhưng với Laravel thì được đấy, với Service container nó hoàn toàn có thể giúp 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ể khám phá Service container cùng Denpendency Injection để nắm rõ hơn các thao tác của chính nó nhé.

Tiếp theo họ buộc phải vào thư mục Providers với tìm về AppServiceProvider nhằm đăng kí. Trong phương thức register() họ đang thêm.

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

"providers" => <... AppProvidersRepositoryServiceProvider::class,>,Quay quay trở lại với PostController tiếng thì PostController của bọn họ sẽ chỉ thao tác cùng với PostRepositoryInterface, chúng ta đã thấy công dụng của Repository Pattern rồi chứ. Trong PostRepositoryInterface bọn họ sẽ xây dựng dựng các cách làm tầm thường cho những Repostories implements nhằm tiến hành bọn chúng, vào Controller thì chúng ta vẫn thực hiện call nhỏng trên để lấy dữ liệu.

Xem thêm: Call To Action Là Gì ? Làm Sao Để Cta Hoạt Động Hiệu Quả? Cách Tối Ưu Cta Tăng Tỷ Lệ Chuyển Đổi

Vậy là qua bài này tôi đã trình làng xong xuôi mang lại chúng ta về Repository Pattern vào Laravel. Hy vọng rất có thể góp chúng ta sẽ mong muốn tò mò và hy vọng clean code có thể phần như thế nào gọi được cùng vận dụng.

liên kết tyêu thích khảo:

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


Chuyên mục: Công Nghệ