Repository pattern là gì

1 năm trướcCập nhật 6 mon trước3,94913 phút đọcCó khá đa số chúng ta đã trải đời bản thân một nội dung bài viết về Repository Design Pattern. Vậy mục tiêu của chính nó là gì? Nó bao gồm thực sự quan trọng mang đến áp dụng của người sử dụng tuyệt không? Những ưu thế, nhược điểm của chính nó là gì? Chúng ta cùng đi sâu mày mò qua bài viết này nhé.

You watching: Repository pattern là gì


*

Repository Design Pattern và áp dụng của chính nó trong Laravel

Repository Design Pattern là gì?

Đây là 1 trong mẫu thiết kế cải thiện mà các bạn new tiếp xúc lập trình sẵn chắc hẳn rằng cũng không lưu ý về nó lắm. Đối cùng với những bạn đã có kinh nghiệm tay nghề thực tập giỏi thao tác làm việc ở các công ti - chắc rằng cũng được nghe những mentor của bản thân nói tới nó. 

Repository Design Pattern (bản thân sẽ tạm bợ viết tắt nó thành RD) là 1 Một trong những mẫu mã xây cất được sử dụng các duy nhất vào hầu như những ngữ điệu lập trình, các framework... nlỗi .NET, Java, PHP...., trải lâu năm từ websites, services, applications,... xuất xắc bao gồm cả Mobile apps. 

*

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

Chúng đưa về sự chuẩn hóa (standardized) đến output với bóc biệt trọn vẹn việc xử lí business logic với data access súc tích, hỗ trợ cho BL hoàn toàn ko đề nghị quan tâm tới quá trình của DB (cùng ngược lại). Việc chia để trị này hướng tới mục tiêu: ai thao tác làm việc nấy, điều này cũng khiến cho code của doanh nghiệp lạc quan rộng, ví dụ hơn, cùng dễ maintenance rộng.

Nói một ví dụ thực tế - vào một xí nghiệp may mang, từng người công nhân nhiều phần phần lớn được phân tách theo team, cùng từng đội chỉ làm cho một trong những phần bé dại trong khâu chế tạo. Có nhóm thì chịu trách nát nhiệm may phần cổ áo, team may tay áo, team may phần thân áo, nhóm ráp những phần tử đó lại cùng nhau, team Chịu đựng trách nhiệm hấp ủi... Một nhóm chỉ tập trung vào trong 1 quá trình rõ ràng chắc hẳn rằng đã nkhô giòn với không nhiều tạo nên sản phẩm lỗi rộng so với một fan làm từ đầu đến cuối đúng không ạ nào? ^^

 

Lợi ích của Repository Design Pattern

Code dễ trở nên tân tiến cùng maintenance Khi thao tác làm việc theo nhóm.Giảm tđọc thay đổi code Khi tất cả biến đổi về kết cấu tài liệu, DB hoặc BL.BL với DB có thể demo độc lậpChuẩn hóa Áp sạc ra dữ liệuGiảm thiểu giống nhau code (DRY - Don"t Repeat Yourself)

 

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

Viết nhiều, viết mệt nhọc, dòng gì cũng bắt buộc nghĩ mang lại tách bóc tránh với mang xuống Repository với tái áp dụng =))Dự án nhỏ tuổi, mì nạp năng lượng ngay tức thì thì không yêu cầu xài cũng đượcVới vấn đề trái đất vẫn chuyển dần dần sang microservice thì câu hỏi áp dụng RD cho mỗi đôi mắt nhỏ vào microservice khá là dư thừa cùng tốn những ngân sách phân phát triển

 

Repository Design Pattern cùng Laravel

Nãy giờ đồng hồ nói lan man quá, toàn là kỹ năng ráo mát =)), tiếng mình xin được phxay 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, đó cũng là nơi triệu tập cập nhật những ngắn gọn xúc tích tầm nã vấn dữ liệu.

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

Điều này cũng như bạn ra ngân hàng rút tiền vậy. quý khách chỉ rất có thể gởi thử dùng tới nhân viên bank, sau đó nhân viên cấp dưới ngân hàng bình chọn và lấy tiền gửi cho bạn. Quý Khách thử tự xông vào mang tiền coi sao, vô tù hãm bóc lịch là bao gồm nha =))

Ủa rồi phần xử lí BL đâu rồi?

Không bắt buộc bản thân code cùi phải vứt trực tiếp phần xử lý BL vào trong Controller những điều đó đâu nha chúng ta =)) 

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

Đối cùng với những business phức hợp sẽ có thêm 1 tầng Service trung tâm nữa. Có nghĩa là bây giờ, Controller chỉ gồm trách nát nhiệm điều phối up load súc tích xuống Service, và Service bắt đầu là địa điểm tiến hành các BL với update xuống DB

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

 

Triển knhì Repository Design Pattern dễ dàng đến Laravel

Khách mặt hàng của bọn họ bắt buộc thiết kế một mạng xã hội có thể chấp nhận được các publishers chia sẻ các albums hình họa cùng kiếm chi phí donate cũng như sự danh tiếng.

See more: Tỉ Lệ An Toàn Vốn ( Capital Adequacy Ratio Là Gì, Tỉ Lệ An Toàn Vốn

Thứ nhất chúng ta sẽ xây dựng dựng một Model.

// app/Album.php namespace App;use IlluminateDatabaseEloquentModel;class Album extends Model protected $guarded = < "id", "created_at", "updated_at", >;Kế tiếp 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 gọi trực tiếp nhằm tầm nã vấn dữ liệu. Mọi cthị trấn đều êm rất đẹp cho tới khi người tiêu dùng mong đổi khác giải pháp truy nã vấn dữ liệu: những Album sẽ được bố trí theo độ liên tưởng, con số views, hoặc trang Album Details được truy hỏi vấn bởi hash_id cố bởi id... Chắc chắn chúng ta vẫn cần được update lại Controller nhằm tróc nã vấn dữ liệu mang đến phù hợp với requirements của khách hàng.

Điều này hết sức nguy nan với củ chuối. Bạn test tưởng tượng không chỉ là gồm mỗi AlbumController triển khai những thao tác như thế này, nhưng không hề ít Controller khác cũng tiến hành điều tương tự. Việc update code nhiều nơi điều đó đã làm cho tăng kỹ năng bỏ sót hoặc thao tác làm việc sai lầm.

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

Chúng ta sẽ tạo một Repository 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à trường đoản cú giờ đồng hồ trsinh hoạt đi, bạn cần thêm logic gì cứ đưa vào Repository nhưng sửa, rõ ràng - sạch sẽ - thô loáng - dễ dàng nắm bắt đề xuất ko nào ^^

 

Câu chuyệ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 phanh ở đâu đó nói rằng dữ liệu của trang web mình hầu như tín đồ ta chỉ bao gồm coi là bao gồm, không buộc phải update gì nhiều cả. Kết thúc công tác, ông người sử dụng những hiểu biết bọn họ phát âm tài liệu lên từ bỏ cache cầm vì truy vấn DB nlỗi hiện thời. 

Giờ bọn họ đề nghị có tác dụng sao? Sửa lại những hàm trong AlbumRepository chăng?

Sai. Chúng ta sẽ tạo nên ra một repository khác chịu trách nát nhiệm xử lí caching cho AlbumRepository.

Ở đây mình sẽ áp dụng một mẫu mã kiến tạo khác, đó bao gồm là Decorator Pattern. Mẫu thi công này giúp chúng ta thêm những tính năng vượt trội mà lại không cần phải cập nhật lại những lớp bây chừ (lớp nghỉ ngơi đó 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 khổng lồ 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 lớn clear cache*/ Sau kia chúng ta yêu cầu import AlbumRepositoryCacheDecorator 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 để ý sự biến đổi làm việc đây: bọn họ vẫn thay đổi lắp thêm được inject vào __construct

Củ chuối lắm chúng ta à. Bởi AlbumRepository không chỉ có được sử dụng ở AlbumController nhỏng ví dụ bên trên, nó còn rất có thể được sử dụng ở mặt hàng tá nơi khác, trường hợp nlỗi bọn họ cập nhật một biện pháp thủ công bằng tay như vậy vẫn có thể dẫn mang lại những lỗi không thích, và khiến code của bọn họ lặp đi lặp lại những lần.

Với sự hỗ trợ của Laravel Service Container, bạn có thể bind một interface tới một class nhất thiết. 

Trước hết họ sẽ 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 đó bọn họ phải chỉnh sửa văn bản mang đến nhì lớp AlbumRepository và AlbumRepositoryCacheDecorator sao để cho chúng implements AlbumRepositoryContract trên.

See more: Hãy Nếm Thử Món Oden Là Gì ? Cách Làm Lẩu Oden Thơm Ngon Chuẩn Vị Người Nhật

use AppRepositoriesContractsAlbumRepositoryContract;class AlbumRepository implements AlbumRepositoryContract class AlbumRepositoryCacheDecorator implements AlbumRepositoryContract Bước tiếp nối đặc biệt quan trọng nhất: bọn họ buộc phải khai báo mang đến Laravel biết phương pháp xử lý lúc bọn họ gọi interface binding. Chúng ta đang update câu chữ cách tiến hành register 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. * *

Chuyên mục: Giải Đáp