Bạn đang xem: Repository pattern là gì
Quý khách hàng vẫn xem: Repository pattern là gì

Repository Design Pattern với ứng dụng của nó vào Laravel
Repository Design Pattern là gì?
Đây là một trong những mẫu mã xây đắp nâng cấp nhưng mà các bạn new xúc tiếp lập trình chắc rằng cũng không để ý về nó lắm. Đối cùng với các bạn đã sở hữu tay nghề thực tập giỏi làm việc sống các công ti - có lẽ rằng cũng đã được nghe những mentor của bản thân nói tới nó.
Repository Design Pattern (mình đang tạm bợ viết tắt nó thành RD) là một trong trong những chủng loại kiến tạo được áp dụng các nhất vào phần lớn các ngữ điệu xây dựng, những framework... nlỗi .NET, Java, PHP..., trải nhiều năm tự websites, services, applications,... tuyệt của cả sản phẩm điện thoại apps.

RD là 1 lớp trung gian giữa Business Logic (BL) và Data Source (DB), những đối tượng người sử dụng trong lớp trung gian này được Call là Repository. Giao tiếp giữa BL và DB sẽ được tiến hành thông qua các Interface.
Chúng đưa về sự chuẩn hóa (standardized) mang đến output với bóc tách biệt trọn vẹn việc up date business lô ghích cùng data access ngắn gọn xúc tích, giúp cho BL trọn vẹn ko đề xuất quan tâm tới quá trình của DB (cùng ngược lại). Việc phân chia nhằm trị này hướng đến mục tiêu: ai thao tác nấy, điều đó cũng khiến cho code của doanh nghiệp lạc quan rộng, rõ ràng rộng, với dễ maintenance hơn.
Nói một ví dụ thực tiễn - vào một xí nghiệp sản xuất may mặc, từng công nhân phần nhiều các được phân tách theo nhóm, với từng nhóm chỉ có tác dụng một phần bé dại vào khâu chế tạo. Có đội thì chịu trách nhiệm may phần cổ áo, đội may ống tay áo, team may phần thân áo, nhóm ráp những bộ phận đó lại với nhau, đội chịu trách nát nhiệm hấp ủi... Một nhóm chỉ tập trung vào một trong những quá trình cụ thể chắc chắn là đã nhanh khô với không nhiều tạo thành sản phẩm lỗi hơn so với một fan làm cho từ trên đầu đến cuối đúng không ạ nào? ^^
Lợi ích của Repository Design Pattern
Code dễ cách tân và phát triển và maintenance Khi thao tác làm việc theo team.Giảm thiểu đổi khác code Lúc bao gồm biến hóa về kết cấu dữ liệu, DB hoặc BL.BL và DB rất có thể kiểm tra độc lậpChuẩn hóa cổng đầu ra dữ liệuGiảm tphát âm trùng lặp code (DRY - Don"t Repeat Yourself)
Cũng hữu ích chưa ổn hại
Viết những, viết mệt nhọc, cái gì cũng cần nghĩ mang lại tách tách với lấy xuống Repository cùng tái thực hiện =))Dự án nhỏ tuổi, mì ăn ngay tắp lự thì ko bắt buộc xài cũng đượcVới Việc thế giới đã chuyển dần dần sang microservice thì vấn đề áp dụng RD cho từng đôi mắt nhỏ vào microservice hơi là dư vượt cùng tốn những ngân sách phát triển
Repository Design Pattern cùng Laravel
Nãy giờ đồng hồ nói lan man thừa, toàn là kỹ năng khô mát =)), giờ đồng hồ bản thân xin được phép liên tiếp phần chính của bài viết.
Trong Laravel, Repository là "cây cầu dừa" nối giữa Model và Controller, đây cũng là địa điểm tập trung xử lí những lô ghích truy nã vấn tài liệu.
Các truy vấn này trước đây được tiến hành thẳng ở Controller hiện thời sẽ tiến hành đưa vào Repository, thời điểm này Controller đang hệ trọng với DB thông qua Repository nuốm vì gọi trực tiếp Model. Việc triển khai tróc nã vấn ra làm sao đã được Repository giấu kín bên phía trong (và Controller bạn dạng thân nó cũng chẳng nên quyên tâm, cứ đọng trả đúng - đầy đủ dữ liệu về đến nó là được rồi).
Vấn đề này tương tự như bạn ra bank rút tiền vậy. Quý khách hàng chỉ có thể gởi đòi hỏi cho tới nhân viên cấp dưới ngân hàng, tiếp nối nhân viên cấp dưới bank đánh giá cùng lấy tiền chuyển cho mình. quý khách hàng demo tự xông vào đem tiền xem sao, vô tù túng bóc tách định kỳ là có nha =))
Ủa rồi phần up load BL đâu rồi?
Không đề nghị mình code cùi nên bỏ trực tiếp phần xử lý BL vào trong Controller những điều đó đâu nha các bạn =))
Trên thực tiễn, một số thao tác get dữ liệu đơn giản dễ dàng sẽ được Hotline thẳng ở Controller thông qua Repository.
Đối với những business phức tạp sẽ có được thêm một tầng Service trọng tâm nữa. có nghĩa là bây giờ, Controller chỉ có trách nát nhiệm điều hướng xử lí lô ghích xuống Service, và Service mới là khu vực thực hiện các BL với cập nhật xuống DB.
Phần Service này mình sẽ nói rõ thêm với chúng ta ở 1 bài viết khác, cho dù sao nội dung bài viết này cũng chỉ nói đến RD thôi mà lại đúng không nhỉ ^^
Triển knhì Repository Design Pattern đơn giản dễ dàng mang lại Laravel
Trước hết chúng ta sẽ xây dựng dựng một Model.
Xem thêm: Tiểu Sử Mark Zuckerberg Là Ai, Tiểu Sử Của Người Sáng Lập Facebook
// app/Album.php namespace App;use IlluminateDatabaseEloquentModel;class Album extends Model protected $guarded = ;tiếp nối là Controller
// app/Http/Controllers/AlbumController.phpnamespace AppHttpControllers;use AppAlbum;class AlbumController extends Controller /** * Nội dung trang Albums List */ public function index() $albums = Album::all(); return $albums; /** * Nội dung trang Albums Details */ public function show($id) $album = Album::findOrFail($id); return $album; Trong Controller, Album được Call trực tiếp để truy vấn tài liệu. Mọi chuyện đầy đủ êm rất đẹp cho tới lúc quý khách mong biến hóa cách truy vấn dữ liệu: những Album sẽ được bố trí theo độ shop, con số views, hoặc trang Album Details được truy vấn bằng hash_id vậy bởi vì id... Chắc chắn họ vẫn rất cần được update lại Controller để truy vấn vấn dữ liệu đến phù hợp cùng với requirements của công ty.
Vấn đề này hết sức nguy nan cùng củ chuối. quý khách demo tưởng tượng không chỉ là có mỗi AlbumController tiến hành những thao tác làm việc như thế này, nhưng không hề ít Controller không giống cũng tiến hành điều tương tự. Việc update code các vị trí điều đó đang làm tăng kĩ năng thải trừ hoặc làm việc sai trái.
Và đó là dịp Repository lên sàn =))
Chúng ta sẽ tạo một Repository hệt như sau
// app/Repositories/Eloquent/AlbumRepository.phpnamespace AppRepositoriesEloquent;use AppAlbum;class AlbumRepository public function all() return Album::orderBy("views_count", "desc")->all(); public function find($id) return Album::firstOrFail( $id>); Cập nhật lại văn bản Controller
// app/Http/AlbumController.phpnamespace AppHttpControllers;use AppAlbum;use AppRepositoriesEloquentAlbumRepository;class AlbumController extends Controller protected $albumRepository; public function __construct(AlbumRepository $albumRepository) $this->albumRepository = $albumRepository; public function index() $albums = $this->albumRepository->all(); return $albums; public function show($id) $album = $this->albumRepository->find($id); return $album; Vậy là từ bỏ giờ trnghỉ ngơi đi, bạn cần thêm logic gì cđọng chui vào Repository mà sửa, cụ thể - sạch sẽ - khô nhoáng - dễ nắm bắt cần ko làm sao ^^
Câu cthị xã vẫn không tới hồi kết
Vào một ngày nọ, người sử dụng của họ nghe phong pkhô giòn đâu đó nói rằng dữ liệu của website mình đa số tín đồ ta chỉ gồm xem như là thiết yếu, không cần update gì các cả. Kết thúc lịch trình, ông khách hàng yêu cầu họ gọi dữ liệu lên từ bỏ cabít cầm cố bởi truy vấn DB nhỏng hiện nay.
Giờ họ đề nghị làm sao? Sửa lại những hàm vào AlbumRepository chăng?
Sai. Chúng ta sẽ khởi tạo ra một repository không giống Chịu đựng trách nát nhiệm up date caching cho AlbumRepository.
Tại phía trên mình đang áp dụng một mẫu kiến thiết không giống, đó chính là Decorator Pattern. Mẫu thiết kế này góp bọn họ thêm các tính năng mới mà không nhất thiết phải cập nhật lại những lớp hiện tại (lớp sinh sống đó chính là AlbumRepository).
// app/Repositories/Cache/AlbumRepositoryCacheDecorator.phpnamespace AppRepositoriesCache;use AppRepositoriesEloquentAlbumRepository;;class AlbumRepositoryCacheDecorator protected $repository; public function __construct() $this->repository = new AlbumRepository(); public function all() /*If cabít exists, get data from cache*/ if ("has-cache") return "data-from-cache"; $albums = $this->repository->all(); /*Logic khổng lồ store cache*/ return $albums; public function find($id) /*If cađậy exists, get data from cache*/ if ("has-cache") return "data-from-cache"; $album = $this->repository->find($id); /*Logic to store cache*/ return $album; public function update($id, array $data) $this->repository->update($id, $data); /*Logic to lớn clear cache*/ Sau kia chúng ta đề nghị import AlbumRepositoryCacheDecorator nắm vì AlbumRepository
// app/Http/AlbumController.phpnamespace AppHttpControllers;use AppRepositoriesCacheAlbumRepositoryCacheDecorator;class AlbumController extends Controller protected $albumRepository; public function __construct(AlbumRepositoryCacheDecorator $albumRepository) $this->albumRepository = $albumRepository; public function index() $albums = $this->albumRepository->all(); return $albums; public function show($id) $album = $this->albumRepository->find($id); return $album; Các bạn phải chú ý sự chuyển đổi sinh hoạt đây: bọn họ đã biến đổi trang bị được inject vào __construct.
Củ chuối lắm các bạn à. Bởi AlbumRepository không chỉ là được thực hiện ở AlbumController như ví dụ trên, nó còn có thể được sử dụng nghỉ ngơi mặt hàng tá nơi khác, ví như nhỏng bọn họ update một biện pháp bằng tay thủ công như thế đang hoàn toàn có thể dẫn mang đến các lỗi không muốn, với khiến cho code của chúng ta lặp đi lặp lại các lần.
Với sự trợ giúp của Laravel Service Container, chúng ta cũng có thể bind một interface tới một class một mực.
Trước hết họ sẽ tạo ra một interface như sau
// app/Repositories/Contracts/AlbumRepositoryContract.phpnamespace AppRepositoriesContracts;interface AlbumRepositoryContract public function all(); public function find($id);Sau đó chúng ta phải chỉnh sửa văn bản mang lại hai lớp AlbumRepository và AlbumRepositoryCacheDecorator thế nào cho chúng implements AlbumRepositoryContract bên trên.
use AppRepositoriesContractsAlbumRepositoryContract;class AlbumRepository implements AlbumRepositoryContract class AlbumRepositoryCacheDecorator implements AlbumRepositoryContract Cách sau đó quan trọng nhất: bọn họ đề xuất knhị báo mang lại Laravel biết cách cập nhật khi chúng ta điện thoại tư vấn interface binding. Chúng ta đã cập nhật văn bản cách thức register bên phía trong tập tin app/Providers/AppServiceProvider.php.
namespace AppProviders;use IlluminateSupportServiceProvider;use AppRepositoriesContractsAlbumRepositoryContract;use AppRepositoriesCacheAlbumRepositoryCacheDecorator;class AppServiceProvider extends ServiceProvider{ /** * Register any application services. * *