Sử dụng L5 Repository làm Repository Design Pattern trong Laravel

Ở bài trước mình đã có bài viết Tại sao nên sử dụng Repository Design Pattern trong Laravel nên ở bài này mình sẽ không giải thích nhiều về Repository Pattern là gì nữa. Mình sẽ tập trung nói về thao tác với repository làm sao cho hiệu quả.


Để tạo ra 1 Repository Design Pattern (RDP) không khó, nhưng làm thế nào để dùng hiệu quả, các member trong team đều sử dụng 1 cách dễ dàng thì không hề dễ. Vậy nên ở bài này mình sẽ giới thiệu về L5 Repository. Công cụ giúp chúng ta thao tác đơn giản hơn, package khá đầy đủ về 1 bộ CRUD cho Dev dùng cũng như tài liệu rất dễ hiểu và cài đặt dễ dàng.

Cài đặt

Link docs: https://github.com/andersao/l5-repository

Install với Composer

composer require prettus/l5-repository

Package được áp dụng với phiên bản Laravel 5.5 trở lên

Trong file config/app.php thêm Prettus\Repository\Providers\RepositoryServiceProvider::class vào providers

'providers' => [
    ...
    Prettus\Repository\Providers\RepositoryServiceProvider::class,
],

Sau đó chúng ta sẽ publish config vừa rồi để dễ dàng chỉnh sửa.

php artisan vendor:publish --provider "Prettus\Repository\Providers\RepositoryServiceProvider"

Sau khi chạy lệnh sẽ tạo ra 1 file config/repository.php

Như vậy là mình đã xong bước tiến hành cài đặt và config. Rất dễ dàng đúng không ạ.

Để tương tác chúng ta cần có Model của mình. L5 đã có command sẵn cho chúng ta tương tác dễ dàng:

php artisan make:entity Product

Tiếp theo mình sẽ tạo 1 repository tên là ProductRepository với cmd

php artisan make:repository Product

Ngoài ra cũng có thể generate Repository 1 cách dễ dàng

'generator'=>[
        'basePath'=>app()->path(),
        'rootNamespace'=>'App\\',
        'paths'=>[
            'models'=>'Models',
            'repositories'=>'Repositories\\Eloquent',
            'interfaces'=>'Contracts\\Repositories',
            'transformers'=>'Transformers',
            'presenters'=>'Presenters'
            'validators'   => 'Validators',
            'controllers'  => 'Http/Controllers',
            'provider'     => 'RepositoryServiceProvider',
            'criteria'     => 'Criteria',
        ]
    ]

Khi tạo Entity hay Reposity thì L5 đã config sẵn rất nhiều command để chúng ta có thể thuận tiện thao tác mà không cần phải code chay.

Ví dụ thêm fillable và rules bằng field –fillable tương tác trong Entity hay –rules khi tạo migration:

php artisan make:entity Product --fillable="name:string,description:text" --rules="name=>required|min:3, description=>nullable"

Khi chúng ta chạy command thì chúng ta sẽ tạo folder EntitiesRepositories trong folder mặc định

Sau đó chúng ta cần bind interface. Ví dụ trong  Repositories Service Provider

Ở đây mình dùng cmd cho tiện

php artisan make:bindings Products

Sử dụng methods

namespace App\Http\Controllers;

use App\PostRepository;

class ProductController extends BaseController {

    protected $repository;

    public function __construct(ProductRepository $repository){
        $this->repository = $repository;
    }

    ....
}

Trong mô hình MVC chúng ta thường hay có các nghiệp vụ CRUD. Mình sẽ tạo 1 số function cơ bản như sau

public function index()
  {
    $products = $this->repository->paginate(20);
    return View::make('products.index', compact('products'));
  }

Mình có sử dụng phân trang bằng paginate. Nếu muốn lấy tất cả thì chỉ cần dùng $this->repository->all()

Hay nếu muốn tìm kiếm theo điều kiện filter client gửi tới có thể dùng findWhere. Mình ví dụ 1 vài condition nhé:

Ở thực tế thì trong Controller chúng ta sẽ không tương tác với Repository mà sẽ qua 1 lớp Service để xử lý logic nữa. Nhưng ở đây mình ví dụ luôn cho các bạn dễ hiểu.

Ngoài ra còn có rất nhiều các hàm nữa, các bạn có thể vào docs trên github của L5 để xem nhé. Hoặc có thể chọc thẳng vào package để xem code của họ như mình. Rất nhiều thứ hay ho đó.

Related Posts