Repository pattern là gì

Trong bài viết này bọn họ đang thuộc mày mò về một vấn đề kể tới khá nhiều vào Laravel sẽ là Repository Pattern. Với mọi chúng ta bắt đầu tìm hiểu về Laravel chắc chắn là cũng không nhiều lưu ý cho vụ việc này. Còn các bạn đi thực tập tại các cửa hàng, những ban trainee thì dĩ nhiên gặp sẽ được những trainer của mình kể tới từ khóa này. Vậy nó là gì nhưng mà, bao gồm thực sự quan trọng không, chúng ta thuộc khám phá nhé.

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

1. Khái niệm

trước hết để phát âm về tư tưởng chúng ta vẫn cùng coi hình họa dưới đây

*

Repository Pattern là một trong những cách tổ chức triển khai source code vào Laravel.Nhìn vào hình ảnh này các ban hoàn toàn có thể hình dung qua qua nó rồi chứ, Repository Pattern là lớp trung gian giữa tầng Data Access cùng Business Logic, hiểu môm na thì nó là lớp trung gian giữa các việc truy vấn dữ liệu với giải pháp xử lý ngắn gọn xúc tích. giúp cho vấn đề truy cập dữ liệu ngặt nghèo cùng bảo mật thông tin rộng.

Bình thường xuyên để lấy dữ liệu gì đó hiển thị ra view thì chúng ta đơn giản viết một Controller query cho Database để đưa ra dữ liệu. Nhưng với Repository pattern như hình bên trên họ thấy Repository nó nằm trong lòng, là trung gian thân Controller với Model. Hiểu đơn giản thì như thế này, lúc bao gồm request điện thoại tư vấn tới controller, controller Điện thoại tư vấn cho tới Repository rồi thằng này hotline tới mã sản phẩm đem data cùng xử lý, controller lấy 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 đã coi ví dụ sau đây nhé

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

Bây tiếng mang sử mình tất cả một tờ Post cùng các bạn có nhu cầu mang ra list thành phầm sắp xếp theo ID sút dần?

Đề bài bác khá là easy bắt buộc 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à chấm dứt easy nên ko, Còn nếu như viết theo Repository pattern thì họ sẽ phải lập thêm một tờ là PostRepository vào một thư mục tên là Repositories, thỏng mục này trong app/

namespace AppRepositories;use AppModelsPost;class PostRepository public function getPostById() return Post::orderBy("id", "desc")->get(); Và vào PostController hôm nay họ đã 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 phía trên thì những bạn sẽ từ bỏ hỏi, sao lại bắt buộc mất công, đang xuất phát điểm từ 1 lớp mang tài liệu ngon lành lại đề xuất viết thêm một tấm nữa ?? Dữ liệu mang ra tương tự như vậy chả không giống gì, nhưng mà thuở đầu chỉ mất vài ba loại code là lấy được, tiếng tốn thêm cả chục chiếc code nữa, tại vì sao lại đề nghị như vậy ??.

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

*
. Và bản thân chắc hẳn rằng cũng một cơ số các bạn nữa lúc mới tò mò về repository cũng đã có lần từ bỏ có câu hỏi này.

Các các bạn có thấy không, Theo phong cách viết không sử dụng repository thì Controller đã thêm chặt và thao tác trực tiếp new Model. Nếu Lúc mà lại Model tất cả sự đổi khác tốt tái cấu tạo bảng nào đó ví dụ như cột title sống bảng posts chúng ta phải thay lại là title_post chẳng hạn thì họ sẽ chạm chán rắc rối Khi yêu cầu kiếm tìm code trong Controller xem nơi nào dùng cho vị trí kia để sửa. Hoặc đau khổ rộng là, nhu yếu quý khách biến hóa vào chiếc ngày trời nắng nóng khổng lồ ông ấy những hiểu biết họ mang theo ID sút dần dần cố kỉnh cơ, rồi vào một trời mưa gió lớn ông ấy lại yên cầu lấy theo lượng xem sút dần dần . Biết làm sao được nên chiều ý người sử dụng thôi.

Easy thôi, vào Controller search chỗ nào orderBy ID desc sửa thành orderBy view desc là kết thúc. Nhưng sự việc ở 1 dự án công trình bọn họ vẫn sử dụng function kia những lần và có thể là trong nhiều Class khác nhau. lúc đó thì chúng ta đã đề xuất lần tìm những Class trong Controller coi chỗ nào có nhằm sửa như thế thì thừa mất thời hạn, chưa tính trong khi sửa rủi ro xóa nhầm giỏi thêm sút nào đấy vào code hoặc sửa thiếu thốn một vài vị trí, rồi lại ngồi dò bug thì cực kì bất tiện. Trong thời điểm này đó là thời gian Repository phát huy công dụng.

Khi viết theo repository thì đơn giản chúng ta chỉ việc vào Repositories vừa chế tác thời điểm nãy tìm vị trí cần sửa, chỉ việc sửa một chỗ, các controller điện thoại tư vấn và áp dụng repository này cũng sẽ đổi khác nlỗi bản thân ước muốn. Đến phía trên các bạn bắt đầu thấy repository có ích rồi nên ko.

Xem thêm: Máy Tính Không Vào Được Win Màn Hình Đen, Khắc Phục Lỗi Màn Hình Đen Hoặc Màn Hình Trống

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

Để giải quyết vấn đề bên trên bọn họ sẽ tạo ra một Interface tầm thường cho những một số loại repositories. Để làm được vấn đề đó bọn chúng ra sẽ tạo thêm 1 tlỗi mục là Contracts và bên trong chế tạo ra thêm 1 thư mục tên là Repositories để viết Interface thông thường nhỏng đang nói trên vào đó, tiếp nối tạo thành một interface tên là PostRepositoryInterface ngơi nghỉ trong các số đó. Tên bản thân đặt kia là không phải nhé các bạn cũng có thể đặt tên khác. Hoặc viết thư mục Contracts bên phía trong thỏng mục Repositories chế tạo lúc đầu cũng khá được. Tất nhiên là với 1 dự án thì bọn họ đề nghị xây dừng nhiều Interface ví dụ này bản thân desgin mang lại Post. lấy ví dụ như một blog thì bọn họ còn nên xây đắp Interface cho 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 thời họ vẫn có 1 interface như một khuôn mẫu mã chúng để cho những Repositories sống trên implement. Nếu vào project họ gồm không chỉ có PostRepositoryInterface nhưng còn có những Interface khác như TagRepositoryInterface, QuestionRepositoryInterface. Và bọn họ nhận ra là trong số Interface này có phần đa function tựa như nhau như all(), update(), create().... Các function nhưng mà Interface nào cũng thấy có thì các bạn đề xuất thiết kế một Interface chung nhằm khai báo những hàm chung trong đó, với lúc này PostRepositoryInterface, TagRepositoryInterface, QuestionRepositoryInterface đang extend từ bỏ chiếc Interface phổ biến vừa nói bên 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ư bắt buộc một function riêng rẽ nào đó không có trong AbstractRepositoryInterface thì họ chỉ việc knhì báo thêm trong số 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 lúc nãy đang implements tự PostRepositoryInterface vẫn yêu cầu có chút ít thay đổi 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ương tự cũng trở thành implements từ PostRepositoryInterface.Và hiện nay vào PostsController bọn họ sẽ thay đổ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 bạn gồm nhận biết điều gì không, Khi bọn họ biến đổi PostsController cố cơ thì Lúc chạy chắc chắc sẽ ảnh hưởng báo lỗi bởi PostRepositoryInterface là 1 trong những Interface với tất nhiên Interface thì cấp thiết sản xuất instance được, bọn họ cần yếu inject Interface vào Controller. Nhưng cùng với Laravel thì được đấy, với Service container nó có thể giúp bọn họ bind một interface vào một implement của nó. Các bạn có thể tìm hiểu Service container với Denpendency Injection nhằm hiểu rõ rộng những làm việc của nó nhé.

Tiếp theo họ buộc phải vào tlỗi mục Providers cùng tìm về AppServiceProvider để đăng kí. Trong cách tiến hành register() bọn họ sẽ thêm.

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

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

Xem thêm: Use Vanishing Point In Photoshop, Cách Ghép Hình Theo Phối Cảnh Trên Photoshop

Vậy là qua bài bác này tôi đã ra mắt ngừng cho các bạn về Repository Pattern trong Laravel. Hy vọng có thể góp chúng ta đã ước ao tò mò cùng ý muốn clean code rất có thể phần làm sao đọc được và vận dụng.

links tyêu thích khảo:

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


Chuyên mục: Blockchain