một năm trướcCập nhật 6 mon trước3,85013 phút ít đọcCó khá nhiều bạn đang kinh nghiệm mình một bài viết về Repository Design Pattern. Vậy mục đích của nó là gì? Nó bao gồm thực thụ quan trọng mang lại ứng dụng của doanh nghiệp tuyệ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 mày mò qua nội dung bài viết này nhé.

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


*

Repository Design Pattern cùng ứng dụng của chính nó trong Laravel

Repository Design Pattern là gì?

Đây là một mẫu mã kiến tạo nâng cấp mà chúng ta new tiếp xúc lập trình chắc rằng cũng không chú ý về nó lắm. Đối cùng với các bạn đã sở hữu kinh nghiệm thực tập tốt thao tác làm việc những công ti - chắc rằng cũng đã được nghe các mentor của chính bản thân mình nói tới nó. 

Repository Design Pattern (mình vẫn tạm thời viết tắt nó thành RD) là một trong trong số những chủng loại xây đắp được thực hiện nhiều duy nhất vào phần nhiều các ngôn từ lập trình, các framework... nhỏng .NET, Java, PHP..., trải dài từ bỏ websites, services, applications,... hay kể cả Mobile apps. 

*

RD là một trong lớp trung gian thân Business Logic (BL) cùng Data Source (DB), các đối tượng người dùng trong lớp trung gian này được điện thoại tư vấn là Repository. Giao tiếp thân BL với DB sẽ được thực hiện thông qua các Interface.

Chúng đem lại sự chuẩn chỉnh hóa (standardized) cho output với tách biệt trọn vẹn câu hỏi up load business ngắn gọn xúc tích với data access súc tích, hỗ trợ cho BL trọn vẹn không buộc phải quyên tâm cho tới công việc của DB (cùng ngược lại). Việc phân tách nhằm trị này hướng tới mục tiêu: ai làm việc nấy, điều đó cũng khiến cho code của chúng ta sáng sủa rộng, rõ ràng rộng, cùng dễ dàng maintenance rộng.

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

 

Lợi ích của Repository Design Pattern

Code dễ dàng cải cách và phát triển và maintenance Khi làm việc theo team.Giảm tphát âm biến đổi code khi bao gồm chuyển đổi về cấu tạo dữ liệu, DB hoặc BL.BL và DB hoàn toàn có thể kiểm tra độ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 có lợi không ổn hại

Viết những, viết mệt mỏi, dòng gì rồi cũng cần suy nghĩ đến tách tách cùng đem xuống Repository cùng tái thực hiện =))Dự án nhỏ tuổi, mì ăn ngay tức khắc thì ko nên xài cũng đượcVới vấn đề thế giới đã gửi dần quý phái microservice thì bài toán vận dụng RD cho từng đôi mắt nhỏ vào microservice tương đối là dư thừa với tốn những chi phí phân phát triển

 

Repository Design Pattern cùng Laravel

Nãy giờ đồng hồ nói lan man vượt, toàn là kỹ năng khô ráo =)), tiếng mình xin được phnghiền liên tục 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à nơi triệu tập up load những súc tích tầm nã vấn dữ liệu.

Các truy hỏi vấn này trước đó được tiến hành trực tiếp ở Controller bây giờ sẽ tiến hành gửi vào Repository, thời điểm này Controller đã liên tưởng với DB thông qua Repository cầm vì Gọi thẳng Model. Việc triển khai truy hỏi vấn ra sao sẽ được Repository giấu kín đáo bên trong (và Controller phiên bản thân nó cũng chẳng đề xuất quyên tâm, cứ trả đúng - đủ dữ liệu về cho nó là được rồi).

Vấn đề này cũng như bạn ra bank rút ít chi phí vậy. Quý khách hàng chỉ có thể gởi thử dùng tới nhân viên cấp dưới bank, sau đó nhân viên ngân hàng đánh giá cùng đem tiền chuyển cho mình. Bạn test tự xông vào lấy chi phí xem sao, vô tù túng tách định kỳ là tất cả nha =))

Ủa rồi phần up load BL đâu rồi?

Không buộc phải mình code cùi nên bỏ thẳng phần up date BL vào trong Controller như vậy đâu nha các bạn =)) 

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

Đối cùng với những business tinh vi sẽ sở hữu thêm một tầng Service trung tâm nữa. Có nghĩa là lúc này, Controller chỉ gồm trách nhiệm điều phối up load ngắn gọn xúc tích xuống Service, và Service new là khu vực thực hiện các BL cùng update xuống DB

Phần Service này bản thân đã phân tích thêm với chúng ta ở 1 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 đến RD thôi mà đúng không ạ ^^

 

Triển knhì Repository Design Pattern đơn giản dễ dàng mang lại Laravel

Khách hàng của họ bắt buộc chế tạo một mạng xã hội được cho phép các publishers share những albums hình họa với tìm chi phí donate cũng như sự nổi tiếng.

Xem thêm: " Santa Là Gì Trong Tiếng Việt? Nghĩa Của Từ Santa, Từ Santa Là Gì

Thứ nhất 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 trực tiếp để truy vấn tài liệu. Mọi cthị xã số đông êm đẹp nhất cho tới khi người sử dụng mong muốn đổi khác phương pháp truy vấn dữ liệu: các Album sẽ được thu xếp theo độ liên quan, số lượng views, hoặc trang Album Details được truy nã vấn bằng hash_id rứa vị id... Chắc chắn bọn họ sẽ cần được cập nhật lại Controller để truy nã vấn dữ liệu mang lại cân xứng với requirements của khách hàng.

Điều này rất là nguy hại cùng củ chuối. quý khách hàng thử tưởng tượng không chỉ có mỗi AlbumController tiến hành các làm việc như thế này, mà lại rất nhiều Controller khác cũng triển khai điều tương tự. Việc update code những địa điểm như vậy vẫn có tác dụng tăng năng lực thải hồi hoặc làm việc sai lạc.

Và đây là thời điểm Repository lên sàn =))

Chúng ta sẽ tạo nên một Repositorgiống 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(<"hash_id" => $id>); Cập nhật lại câu chữ 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ờ trở đi, bạn cần thêm ngắn gọn xúc tích gì cứ đọng đưa vào Repository mà lại sửa, rõ ràng - thật sạch - thô nhoáng - dễ dàng nắm bắt buộc phải ko như thế nào ^^

 

Câu chuyện vẫn không tới hồi kết

Vào một ngày nọ, quý khách hàng của họ nghe phong pkhô cứng đâu đó bảo rằng dữ liệu của website bản thân đa số bạn ta chỉ gồm xem như là chủ yếu, không yêu cầu update gì các cả. Kết thúc lịch trình, ông người sử dụng yêu cầu họ hiểu dữ liệu lên trường đoản cú cabịt cụ vày truy vấn DB nlỗi hiện tại. 

Giờ chúng ta đề nghị làm cho sao? Sửa lại các 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 cập nhật caching cho AlbumRepository.

Tại đây bản thân sẽ áp dụng một mẫu mã kiến tạo không giống, đó chính là Decorator Pattern. Mẫu xây dựng này góp họ thêm các tính năng được cải thiện cơ mà không cần phải cập nhật lại các lớp ngày nay (lớp sinh hoạt đó 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 cađậy exists, get data from cache*/ if ("has-cache") return "data-from-cache"; $albums = $this->repository->all(); /*Logic to 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 khổng lồ store cache*/ return $album; public function update($id, array $data) $this->repository->update($id, $data); /*Logic to clear cache*/ Sau đó họ đề nghị import AlbumRepositoryCacheDecorator thế 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 hóa ở đây: chúng ta sẽ đổi khác thứ được inject vào __construct

Củ chuối lắm các bạn à. Bởi AlbumRepository không những được sử dụng ở AlbumController nhỏng ví dụ trên, nó còn rất có thể được áp dụng sinh hoạt sản phẩm tá nơi khác, trường hợp như chúng ta cập nhật một cách thủ công điều đó đã rất có thể dẫn mang đến nhiều lỗi không muốn, cùng khiến code của chúng ta lặp đi tái diễn nhiều lần.

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

Đầu tiên chúng ta sẽ khởi tạo ra một interface nlỗi sau

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

use AppRepositoriesContractsAlbumRepositoryContract;class AlbumRepository implements AlbumRepositoryContract class AlbumRepositoryCacheDecorator implements AlbumRepositoryContract Bước tiếp đến đặc trưng nhất: bọn họ yêu cầu knhì báo mang đến Laravel biết phương pháp xử lý Lúc họ gọi interface binding. Chúng ta đang cập nhật ngôn từ cách tiến hành 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. * *

Bài viết liên quan

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *