một năm trướcCập nhật 6 mon trước3,77413 phút ít đọcCó hơi nhiều bạn vẫn đề xuất mình một nội dung bài viết về Repository Design Pattern. Vậy mục đích của chính nó là gì? Nó tất cả thực thụ quan trọng mang đến ứng dụng của bạn tốt không? Những ưu điểm, nhược điểm của chính nó là gì? Chúng ta cùng đi sâu tìm hiểu qua bài viết này nhé.

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


*

Repository Design Pattern cùng áp dụng của nó trong Laravel

Repository Design Pattern là gì?

Đây là một trong chủng loại thi công nâng cao cơ mà các bạn new tiếp xúc thiết kế có lẽ cũng ko để ý về nó lắm. Đối cùng với các bạn đã sở hữu kinh nghiệm tay nghề thực tập hay thao tác nghỉ ngơi các công ti - chắc hẳn cũng sẽ được nghe những mentor của chính mình nói tới nó. 

Repository Design Pattern (mình đang nhất thời viết tắt nó thành RD) là 1 trong giữa những mẫu xây đắp được thực hiện các độc nhất vào hầu hết những ngôn ngữ lập trình, những framework... nhỏng .NET, Java, PHPhường..., trải lâu năm trường đoản cú websites, services, applications,... tốt của cả di động apps. 

*

RD là một trong lớp trung gian giữa Business Logic (BL) với Data Source (DB), những đối tượng người dùng vào lớp trung gian này được gọi là Repository. Giao tiếp thân BL và DB sẽ tiến hành tiến hành thông qua các Interface.

Chúng mang về sự chuẩn chỉnh hóa (standardized) đến output với tách biệt hoàn toàn Việc up load business xúc tích với data access lô ghích, giúp cho BL trọn vẹn ko yêu cầu quan tâm tới công việc của DB (cùng ngược lại). Việc chia để trị này hướng về mục tiêu: ai thao tác nấy, điều ấy cũng khiến cho code của công ty tự tin rộng, cụ thể hơn, với dễ maintenance rộng.

Nói một ví dụ thực tiễn - vào một nhà máy may khoác, mỗi công nhân nhiều phần những được phân tách theo nhóm, và từng nhóm chỉ làm cho một trong những phần nhỏ dại trong khâu tiếp tế. Có nhóm thì Chịu trách nhiệm may phần cổ áo, team may tay áo, team may phần thân áo, đội ráp những thành phần đó lại với nhau, đội Chịu đựng trách nhiệm hấp ủi... Một nhóm chỉ triệu tập vào một trong những công việc rõ ràng chắc chắn rằng đang nhanh và ít tạo nên thành phầm lỗi hơn so với một bạn làm cho từ trên đầu mang lại cuối đúng không nhỉ nào? ^^

 

Lợi ích của Repository Design Pattern

Code dễ dàng phát triển với maintenance khi làm việc theo đội.Giảm tgọi chuyển đổi code Lúc bao gồm thay đổi về cấu tạo dữ liệu, DB hoặc BL.BL cùng DB hoàn toàn có thể demo độc lậpChuẩn hóa đầu ra dữ liệuGiảm tgọi đụng hàng code (DRY - Don"t Repeat Yourself)

 

Cũng bổ ích không ổn hại

Viết các, viết mệt mỏi, cái gì cũng yêu cầu suy nghĩ cho tách bóc tách cùng lấy xuống Repository với tái sử dụng =))Dự án nhỏ tuổi, mì ăn uống tức thì thì ko nên xài cũng đượcVới Việc thế giới sẽ chuyển dần sang microservice thì Việc áp dụng RD cho từng đôi mắt nhỏ dại trong microservice tương đối là dư thừa và tốn những ngân sách vạc triển

 

Repository Design Pattern và Laravel

Nãy giờ nói lan man thừa, toàn là kỹ năng và kiến thức ráo mát =)), giờ đồng hồ bản thân xin được phnghiền tiếp tục phần thiết yếu của nội dung 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à vị trí tập trung xử lý những lô ghích truy nã vấn dữ liệu.

Các tầm nã vấn này trước đây được tiến hành thẳng ở Controller hiện nay sẽ tiến hành đưa vào Repository, thời điểm này Controller đang thúc đẩy với DB thông qua Repository rứa do hotline trực tiếp Model. Việc thực hiện truy vấn vấn ra sao sẽ được Repository giấu kín đáo bên trong (và Controller bạn dạng thân nó cũng chẳng cần quan tâm, cứ trả đúng - đủ dữ liệu về mang lại nó là được rồi).

Vấn đề này cũng giống như các bạn ra bank rút ít chi phí vậy. quý khách hàng chỉ hoàn toàn có thể gởi hưởng thụ tới nhân viên bank, tiếp đến nhân viên cấp dưới ngân hàng kiểm tra và đem chi phí gửi cho mình. Bạn demo từ bỏ xông vào lấy chi phí xem sao, vô tù tách bóc định kỳ là có nha =))

Ủa rồi phần cập nhật BL đâu rồi?

Không bắt buộc mình code cùi đề xuất vứt trực tiếp phần up load BL vào trong Controller điều này đâu nha các bạn =)) 

Trên thực tế, một số trong những làm việc get tài liệu dễ dàng và đơn giản sẽ được Call thẳng ở Controller thông qua Repository.

Đối cùng với những business phức tạp sẽ có thêm 1 tầng Service trung tâm nữa. tức là hôm nay, Controller chỉ gồm trách nát nhiệm điều phối cập nhật súc tích xuống Service, và Service mới là địa điểm triển khai các BL cùng cập nhật xuống DB

Phần Service này bản thân sẽ nói rõ thêm với các bạn ở một nội dung bài viết không giống, dù sao nội dung bài viết này cũng chỉ nói về RD thôi cơ mà đúng không nhỉ ^^

 

Triển khai Repository Design Pattern dễ dàng mang đến Laravel

Khách mặt hàng của bọn họ nên thi công một social được cho phép các publishers chia sẻ các albums hình ảnh và tìm chi phí donate cũng như sự khét tiếng.

Xem thêm: Quy Trình Trồng Rau Thủy Canh Tại Nhà Chưa Chắc Có Rau Ăn, Quy Trình Trồng Rau Thủy Canh

Trước hết bọn họ sẽ xây dựng một Model.

// app/Album.php namespace App;use IlluminateDatabaseEloquentModel;class Album extends Model protected $guarded = < "id", "created_at", "updated_at", >;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 hotline thẳng nhằm truy tìm vấn dữ liệu. Mọi cthị xã đa số êm đẹp mắt cho đến lúc khách hàng ước ao thay đổi giải pháp truy vấn dữ liệu: các Album sẽ tiến hành sắp xếp theo độ liên hệ, con số views, hoặc trang Album Details được truy nã vấn bằng hash_id cầm cố vì id... Chắc chắn họ sẽ cần phải update lại Controller nhằm truy vấn vấn dữ liệu đến cân xứng cùng với requirements của doanh nghiệp.

Như vậy rất là nguy hại cùng củ chuối. Quý Khách thử tưởng tượng không những có mỗi AlbumController thực hiện các làm việc như thế này, mà lại tương đối nhiều Controller không giống cũng triển khai điều tương tự như. Việc update code các chỗ những điều đó đang làm cho tăng khả năng vứt bỏ hoặc thao tác làm việc sai lạc.

Và đấy là cơ hội Repository lên sàn =))

Chúng ta sẽ khởi tạo một Repositorgiống 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(<"hash_id" => $id>); Cập nhật lại nội dung 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ự giờ đồng hồ trngơi nghỉ đi, bạn phải thêm lô ghích gì cứ đưa vào Repository nhưng sửa, cụ thể - thật sạch - khô nháng - dễ hiểu yêu cầu ko nào ^^

 

Câu cthị trấn vẫn không đến hồi kết

Vào một ngày nọ, khách hàng của họ nghe phong pkhô cứng ở đâu đó bảo rằng dữ liệu của website mình số đông tín đồ ta chỉ gồm coi là thiết yếu, không bắt buộc update gì các cả. Kết thúc chương trình, ông khách hàng trải nghiệm chúng ta phát âm tài liệu lên từ bỏ cabít nỗ lực vì truy vấn DB như hiện giờ. 

Giờ chúng ta đề nghị làm cho sao? Sửa lại những hàm trong AlbumRepository chăng?

Sai. Chúng ta sẽ tạo ra một repository khác Chịu trách rưới nhiệm cập nhật caching cho AlbumRepository.

Tại phía trên mình đang áp dụng một chủng loại thiết kế không giống, đó chính là Decorator Pattern. Mẫu kiến tạo này giúp chúng ta thêm các tính năng lạ cơ mà không cần phải cập nhật lại các lớp hiện thời (lớp nghỉ ngơi đây 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 cache exists, get data from cache*/ if ("has-cache") return "data-from-cache"; $albums = $this->repository->all(); /*Logic to lớn store cache*/ return $albums; public function find($id) /*If cabít exists, get data from cache*/ if ("has-cache") return "data-from-cache"; $album = $this->repository->find($id); /*Logic lớn store cache*/ return $album; public function update($id, array $data) $this->repository->update($id, $data); /*Logic lớn clear cache*/ Sau kia bọn họ bắt buộc import AlbumRepositoryCacheDecorator nỗ lực 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 cần chú ý sự biến đổi sinh hoạt đây: họ sẽ chuyển đổi máy được inject vào __construct

Củ chuối lắm chúng ta à. Bởi AlbumRepository không chỉ là được thực hiện ở AlbumController như ví dụ bên trên, nó còn có thể được áp dụng sinh sống hàng tá nơi khác, nếu như nlỗi chúng ta update một phương pháp thủ công điều này sẽ có thể dẫn cho nhiều lỗi không thích, cùng khiến cho code của họ lặp đi lặp lại các lần.

Với sự giúp đỡ của Laravel Service Container, bạn cũng có thể bind một interface cho tới một class nhất mực. 

Trước hết họ sẽ khởi tạo ra một interface như sau

// app/Repositories/Contracts/AlbumRepositoryContract.phpnamespace AppRepositoriesContracts;interface AlbumRepositoryContract public function all(); public function find($id);Sau đó họ nên chỉnh sửa văn bản cho nhì lớp AlbumRepository và AlbumRepositoryCacheDecorator sao cho chúng implements AlbumRepositoryContract trên.

Xem thêm: Adsorption Là Gì, Nghĩa Của Từ Adsorption, Adsorption Là Gì, Nghĩa Của Từ Adsorption

use AppRepositoriesContractsAlbumRepositoryContract;class AlbumRepository implements AlbumRepositoryContract class AlbumRepositoryCacheDecorator implements AlbumRepositoryContract Bước kế tiếp đặc biệt nhất: họ cần knhì báo mang lại Laravel biết phương pháp xử lí khi bọn họ hotline interface binding. Chúng ta đã cập nhật văn bản phương thức register phía bên trong tập tin app/Providers/AppServiceProvider.php.

namespace AppProviders;use IlluminateSupportServiceProvider;use AppRepositoriesContractsAlbumRepositoryContract;use AppRepositoriesCacheAlbumRepositoryCacheDecorator;class AppServiceProvider extends ServiceProvider{ /** * Register any application services. * *