Ở 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 Entities và Repositories 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 đó.