HomeOur Team
Repository Pattern trong Laravel
Articles
Repository Pattern trong Laravel
October 22, 2019
4 min

Design pattern là gì ?

  • Design Pattern là một kỹ thuật trong lập trình hướng đối tượng, cung cấp cho chúng ta cách tư duy trong các tình huống xảy ra của lập trình hướng đối tượng cũng như trong quá trình phân tích thiết kế và phát triển phần mềm. Vì vậy Design Pattern không phải là một Class, cũng không phải là một Library, và cũng không hề là một ngôn ngữ cụ thể nào cả.
  • Design Pattern cung cấp cho chúng ta các mẫu thiết kế, các giải pháp cho các vấn đề chung thường gặp trong lập trình, đảm bảo sẽ cung cấp cho chúng ta các giải pháp tối ưu trong việc giải quyết các vấn đề trong lập trình. .
  • Repository Pattern là một mẫu thiết kế trong design pattern .
  • Hôm này em / mình mạn phép chia sẻ cách áp dụng cụ thể vào 1 project , cụ thể là trong Laravel Framework .

Phân loại Design Pattern

  • Design Pattern được chia làm 3 nhóm chính :+1:
  • Nhóm khởi tạo (Creational): giúp chúng ta trong việc khởi tạo các đối tượng, cung cấp các thủ thuật để khởi tạo đối tượng mà không cần đến từ khóa new. VD: Abstract Factory, Factory Method, Singleton, Builder, Prototype…
  • Nhóm cấu trúc (Structural): thường dùng để giải quyết mối quan hệ giữa các thực thể (entities), giúp thao tác với các đối tượng dễ dàng hơn. VD: Adapter, Bridge, Composite, Decorator, Facade, Proxy và Flyweight…
  • Nhóm hành vi (Behavioral): dùng trong việc thể hiện các hành vi của đối tượng, tương tác (communicate) giữa các đối tượng dễ dàng hơn. VD: Interpreter, Template Method, Chain of Responsibility, Command, Iterator, Mediator, Memento, Observer, State, Strategy và Visitor…

Vì sao nên sử dụng Design Pattern?

  • Design Pattern cung cấp cho chúng ta các giải pháp ở dạng tổng quát nhất, giúp chúng ta tăng tốc độ phát triển phần mềm thông qua các mô hình đã được kiểm nghiệm thực tế.
  • Sử dụng Design Pattern giúp chúng ta tránh được các lỗi tiềm ẩn (nhất là trong những hệ thống lớn), đồng thời có khả năng tái sử dụng cao để có thể dễ nâng cấp và bảo trì trong tương lai.

Repository Pattern là gì ?

  • Repository Pattern là lớp trung gian giữa tầng Bussiness Logic và Data Access, giúp cho việc truy cập dữ liệu chặt chẽ và bảo mật hơn .

  • Repository đóng vài trò là một kết nối giữa tầng Business và Model của ứng dụng .

  • Thông thường thì các phần truy xuất, giao tiếp với database năm rải rác ở trong code, khi bạn muốn thực hiện một thao tác lên database thì phải tìm trong code cũng như tìm các thuộc tính trong bảng để xử lý. Điều này gây lãng phí thời gian và công sức rất nhiều.

  • Với Repository design pattern, thì việc thay đổi ở code sẽ không ảnh hưởng quá nhiều công sức chúng ra chỉnh sửa.

  • Một số lý do chung ta nên sử dụng Repository Pattern :100:

    • Một nơi duy nhất để thay đổi quyền truy cập dữ liệu cũng như xử lý dữ liệu.
    • Một nơi duy nhất chịu trách nhiệm cho việc mapping các bảng vào object.
    • Rất dễ dàng để thay thế một Repository với một implementation giả cho việc testing, vì vậy bạn không cần chuẩn bị một cơ sở dữ liệu có sẵn.
  • Hiểu như này nhé :D , Khi mình muốn truy xuất dữ liệu tư DB , Thay vì chúng ta viết logic trong Controller thì tạo ra 1 Repository rồi code xử lý tương tác với DB trong này . Sau đó chúng ta sẽ inject vào Controller thông qua hàm __construct .

  • Ưu Điểm :

    • Code dễ maintain tường minh cho code .
    • Hạn chế lỗi trong truy vấn
    • Tránh việc trùng lặp code
    • Code dễ đọc , dễ hiểu và dễ phát triển
    • Giảm lượng code nhờ việc chỉ cần gọi các phương thức trong repository ra.
    • Hạn chế các phụ thuộc giữa việc sử lý logic code và phần tương tác với cơ sở dữ liệu.
    • Giảm khả năng code thiếu ở cùng một nơi xử lý.
    • Dễ dàng trong việc viết Unit Test, giảm rủi ro trong maintain.
    • Hiệu quả cho việc sử dụng cache.
    • Nhược Điểm :
    • Với những dự án quy mô nhỏ, bạn có thể thấy việc làm này thừa thãi và phải viết thêm nhiều code. Tuy nhiên với những dự án quy mô lớn với những logic phức tạp hay luôn thay đổi yêu cầu, lớp trừu tượng Repository này thực sự có ích cho bạn.

Repository trong laravel

  • Để dễ hiểu hơn Repository trong laravel thì chúng ta sẽ đi vào 1 ví dụ nhỏ xây dựng 1 controller được inject repo vào và sử dụng đúng với mục đích chỉ là điều hướng của nó nhé .

Bước 1:

  • Trong thư mục app trong ứng dụng Laravel của bạn, tạo 1 thư mục có tên là Repositories.
  • Trong thư mục sẽ có 2 Folder là Eloquents và Interfaces , (đây là mình tự chia ra để dễ quản lý thôi )
  • Trong Interfaces sẽ chứa 1 IBaseRepository.php (dùng để định nghĩa các function mà class implemets lại nos)
  • Trong Eloquents chúng ta sẽ tạo 1 abtract class BaseRepository.php implements IBaseRepository .

Bước 2 : Binding Provider Trong Laravel

  • Tiếp theo chúng ta sẽ tạo ra 1 file RepositoryServiceProvider.phpphp artisan make:provider RepositoryServiceProvider
  • Sau đó đăng ký trong app/config : App\Providers\RepositoryServiceProvider::class,
  • Trong RepositoryServiceProvider.php $this->app->singleton(IUserRepository::class, UserRepository::class);

Bước 3 :

  • Mình có 1 model User mình sẽ áp dụng repository pattern ở đây đúng như ở trên đã nó nó chỉ tương tác với Data Access .

  • Tạo 1 File là UserRepository.php extends BaseRepository và implements IUserRepository

    Bạn tạo IUserRepository ở bên Folder Interfaces nhé

  • UserRepository :

      namespace App\Repositories\Eloquents;
    
      use App\Models\User;
      use App\Repositories\Interfaces\IUserRepository;
    
      class UserRepository extends BaseRepository implements IUserRepository
      {
          public function __construct()
          {
              $this->model = new User();
          }
    
          public  function getAll()
          {
              return $this->model->all();
          }
    
          public function getUserlasted()
          {
              return $this->model->select('id', 'email', 'role', 'created_at', 'updated_at')
                  ->orderBy('created_at', 'desc')
                  ->get();
          }
    
          public function findByEmail($email)
          {
              return $this->model->whereEmail($email)->first();
          }
      }
    
  • IUserRepository :

      namespace App\Repositories\Interfaces;
    
      interface IUserRepository extends IBaseRepository
      {
          /**
           * Get all
           * @return mixed
           */
          public function getAll();
    
          /**
           * Get all
           * @return mixed
           */
          public function getUserlasted();
    
          /**
           * Find a user by email
           * @return User
           */
          public function findByEmail(string $email);
      }
    

Bước 4: Tạo Controller

  • Ở đây chúng ta sử dụng Controler đúng với mục đích của nó là điều hướng :

    namespace App\Http\Controllers;

      use App\Repositories\Interfaces\IUserRepository;
    
      class HomeController extends Controller
      {
          protected $userRepository;
          /**
           * Create a new controller instance.
           *
           * @return void
           */
          public function __construct(IUserRepository $userRepository)
          {
              $this->middleware('auth');
              $this->userRepository = $userRepository;
          }
    
          /**
           * Show the application dashboard.
           *
           * @return \Illuminate\Contracts\Support\Renderable
           */
          public function index()
          {
              return $this->userRepository->getAll();
          }
    
          public function about()
          {
              return view('about');
          }
    
          public function conctact()
          {
              return view('contact');
          }
      }
      
    
  • Trên đây chúng ta sẽ inject Interface IUserRepository qua hàm khởi tạo __construct để sử dụng :

  • Bạn có thắc mắc tại sao lại là không inject UserRepository mà lại inject IUserRepository . Bời vì chúng ta đã binding nó ở Bước 2 rồi đó . Vì thế inject Interface nó sẽ tự động truy xuất userRepository và sử dụng nó . Nó có 1 cái hay là khi bạn thay đổi database hoặc thay đổi hẳn base mới thì việc làm chúng ta chỉ cần tạo 1 interface mới rồi binding lại thôi , Đây được gọi là thiết kế nguyên lý phần mềm Inversion of Control (IOC) .

Kết Thúc

  • Trên đây là những chia sẻ kiến thức khi mình đã làm và áp dụng vào dự án . Hy vọng sẽ đem lại thêm chút gì đó cho mọi người . Thanks for read (bow)

Tags

#pattern#laravel#102020

Related Posts

Design Pattern chap 1 - Factory Method
Design Pattern chap 1 - Factory Method
nam.pham
October 26, 2020
1 min
Học cách học
Softskills
Học cách học
October 30, 2020
6 min
Android Studio 4.1 có gì mới?
News
Android Studio 4.1 có gì mới?
October 29, 2020
3 min
Sign In with Apple - Backend (Java)
Solutions
Sign In with Apple - Backend (Java)
October 29, 2020
3 min
© 2021, All Rights Reserved.

Quick Links

HomeOur Team

Social Media