Trong bài viết này bọn họ vẫn thuộc tò mò về một vấn đề nói đến không ít trong Laravel chính là Repository Pattern. Với hầu hết các bạn bắt đầu khám phá về Laravel chắc là cũng tương đối ít chú ý mang lại vấn đề này. Còn chúng ta đi thực tập tại các công ty, các ban trainee thì Chắn chắn gặp mặt sẽ tiến hành những trainer của bản thân mình nói đến từ bỏ khóa này. Vậy nó là gì cơ mà, tất cả thực sự quan trọng ko, họ thuộc mày mò nhé.quý khách hàng sẽ xem: Repository là gì

1. Khái niệm

Đầu tiên để hiểu về khái niệm chúng ta đang thuộc coi hình ảnh dưới đây

*

Repository Pattern là 1 bí quyết tổ chức source code vào Laravel.Nhìn vào ảnh này những ban rất có thể tưởng tượng qua qua nó rồi chđọng, Repository Pattern là lớp trung gian giữa tầng Data Access và Business Logic, phát âm môm na thì nó là lớp trung gian giữa những việc truy cập tài liệu và cách xử trí ngắn gọn xúc tích. hỗ trợ cho vấn đề truy cập tài liệu ngặt nghèo với bảo mật thông tin hơn.

Bạn đang xem: Repository là gì, nghĩa của từ repository

Bình thường để đưa tài liệu gì đó hiển thị ra view thì chúng ta đơn giản dễ dàng viết một Controller query mang đến Database để đưa ra dữ liệu. Nhưng với Repository pattern nhỏng hình trên họ thấy Repository nó nằm giữa, là trung gian thân Controller cùng Model. Hiểu đơn giản thì như thế này, khi có request call tới controller, controller Call cho tới Repository rồi thằng này Call cho tới Mã Sản Phẩm lấy data và xử lý, controller rước tài liệu thì chỉ câu hỏi Điện thoại tư vấn mang đến thằng này.Lí ttiết thì nói vậy thôi chứ còn nhằm áp dụng nó vào dự án thì họ đã coi ví dụ sau đây nhé

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

Bây giờ đồng hồ đưa sử mình gồm một tấm Post cùng những bạn có nhu cầu lôi ra list thành phầm sắp xếp theo ID bớt dần?

Đề bài xích tương đối là easy đề xuất không đơ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à kết thúc easy cần ko, Còn giả dụ viết theo Repository pattern thì họ đang phải lập thêm một lớp là PostRepository vào một thỏng mục thương hiệu là Repositories, thư mục này trong app/

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

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

*

. Và mình chắc chắn rằng cũng một cơ số chúng ta nữa Khi bắt đầu mày mò về repository cũng đã từng từ bỏ tất cả thắc mắc này.

Các bạn có thấy ko, theo cách viết ko cần sử dụng repository thì Controller đã đính thêm chặt và thao tác làm việc trực tiếp new model. Nếu Lúc nhưng mà Model bao gồm sự biến đổi xuất xắc tái kết cấu bảng nào đó ví như cột title sinh sống bảng posts họ đề xuất gắng lại là title_post ví dụ điển hình thì chúng ta đang chạm chán trắc trở Lúc đề nghị tìm code vào Controller xem nơi nào cần sử dụng đến địa điểm kia để sửa. Hoặc cực khổ hơn là, nhu cầu quý khách hàng đổi khác vào mẫu ngày trời nắng và nóng khổng lồ ông ấy thử dùng họ rước theo ID giảm dần cầm cơ, rồi vào một trong những ngày mưa gió khổng lồ ông ấy lại yên cầu lấy theo lượt xem bớt dần . Biết làm thế nào được nên chiều ý người sử dụng thôi.

Easy thôi, vào Controller kiếm tìm chỗ nào orderBy ID desc sửa thành orderBy view desc là kết thúc. Nhưng vụ việc tại 1 dự án họ đang áp dụng function đó nhiều lần với hoàn toàn có thể là trong nhiều Class khác nhau. khi kia thì họ đang buộc phải lần tìm những Class vào Controller coi nơi nào có nhằm sửa như vậy thì quá mất thời gian, chưa tính trong những khi sửa rủi ro xóa nhầm tốt thêm giảm gì đấy vào code hoặc sửa thiếu hụt một vài ba nơi, rồi lại ngồi mò bug thì cực kì phiền toái. Hiện giờ đó là lúc Repository đẩy mạnh chức năng.

Xem thêm: Là Gì? Nghĩa Của Từ Snack Bar Là Gì Nghĩa Của Từ Snack

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

Để xử lý vụ việc trên bọn họ sẽ khởi tạo ra một Interface thông thường cho các một số loại repositories. Để làm cho được vấn đề này bọn chúng ra sẽ tạo thêm một tlỗi mục là Contracts với bên trong sinh sản thêm 1 thư mục thương hiệu là Repositories nhằm viết Interface thông thường nlỗi sẽ nói trên vào đó, tiếp nối sinh sản một interface tên là PostRepositoryInterface nghỉ ngơi trong đó. Tên mình đặt kia là ko nên nhé các bạn có thể viết tên khác. Hoặc viết thư mục Contracts bên trong thư mục Repositories tạo ra ban sơ cũng khá được. Tất nhiên là với một dự án công trình thì chúng ta yêu cầu kiến tạo nhiều Interface ví dụ này bản thân sản xuất đến Post. ví dụ như một blog thì bọn họ còn nên tạo ra Interface cho Tag, Question... các Interface này đã đặt hết trong AppContractsRepositories nhé.

namespace AppContractsRepositories;interface PostRepositoryInterface public function getPostById(); ...Và bây chừ bọn họ vẫn có một interface như một khuôn mẫu mã chúng khiến cho các Repositories sinh sống bên trên implement. Nếu vào project chúng ta có không những PostRepositoryInterface cơ mà còn tồn tại các Interface khác ví như TagRepositoryInterface, QuestionRepositoryInterface. Và chúng ta nhận ra là trong các Interface này còn có gần như function giống như nhau nhỏng all(), update(), create().... Các function mà lại Interface nào cũng thấy có thì chúng ta buộc phải gây ra một Interface chung để khai báo những hàm tầm thường trong những số đó, với lúc này PostRepositoryInterface, TagRepositoryInterface, QuestionRepositoryInterface đã extend trường đoản cú cái Interface thông thường vừa nói 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ư cần một function riêng biệt như thế nào đó không tồn tại 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); .....Hiện nay thì PostRepository họ vừa viết lúc nãy đã implements từ PostRepositoryInterface sẽ bắt buộc có chút biến hóa nhỏng sau

namespace AppRepositories;​use AppModelsPost;​class PostRepository implements PostRepositoryInterface{ //override public function getPostById() return Post::orderBy("id", "desc")->get(); Redis tuyệt Mongo thì giống như cũng sẽ implements từ bỏ PostRepositoryInterface.Và bây chừ vào PostsController chúng ta sẽ cố đổ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 các bạn gồm nhận biết điều gì không, lúc bọn họ biến hóa PostsController thay kia thì Lúc chạy dĩ nhiên có thể có khả năng sẽ bị báo lỗi do PostRepositoryInterface là 1 Interface với tất nhiên Interface thì chẳng thể sản xuất instance được, chúng ta tất yêu inject Interface vào Controller. Nhưng cùng với Laravel thì được đấy, với Service container nó hoàn toàn có thể góp bọn họ bind một interface vào một implement của chính nó. Các chúng ta có thể tò mò Service container và Denpendency Injection nhằm hiểu rõ rộng các thao tác làm việc của nó nhé.

Tiếp theo chúng ta đề xuất vào thư mục Providers cùng tìm tới AppServiceProvider để đăng kí. Trong cách tiến hành register() họ đang thêm.

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

Vậy là qua bài xích này mình đã ra mắt dứt cho các bạn về Repository Pattern vào Laravel. Hy vọng có thể giúp chúng ta đã hy vọng tò mò với hy vọng clean code hoàn toàn có thể phần như thế nào đọc được với vận dụng.

liên kết tđắm say khảo:

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

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 *