Cài đặt và sử dụng I5-repository
This post hasn't been updated for 7 years
**Như các bạn đã biết, Repository pattern là một kỹ thuật lập trình Dependency pattern và mình sẽ không nói nhiều thêm về các định nghĩa của repository là gì. Ở bài viết này, mình sẽ hướng dẫn các bạn cài đặt packet I5-repository để tạo và thao tác với repository một cách hiệu quả hơn. Nào bây giờ chúng ta bắt đầu.
Đầu tiên, các bạn vào cái link này https://github.com/andersao/l5-repository Sau đó các bạn vào command và chạy lệnh
composer require prettus/l5-repository
để cài đặt phiên bản mới nhất. Tiếp theo trong project của các bạn, đến fileconfig/app.php
thêm vàoPrettus\Repository\Providers\RepositoryServiceProvider::class
ởproviders
'providers' => [
...
Prettus\Repository\Providers\RepositoryServiceProvider::class,
],
Đăng ký Luman
$app->register(Prettus\Repository\Providers\LumenRepositoryServiceProvider::class);
Tiếp tục, chúng ta chạy lệnhphp artisan vendor:publish
Công việc tiếp theo các bạn sẽ tạo repository
namespace App;
use Prettus\Repository\Eloquent\BaseRepository;
class PostRepository extends BaseRepository {
/**
* Specify Model class name
*
* @return string
*/
function model()
{
return "App\\Post";
}
}
Hoặc bạn có thể tạo repository một cách dễ dàng bằng generate.
Đầu tiên, config lại nơi sẽ lưu các repository. Mặc định sẽ là thư mục app và namespace sẽ là "App". Chú ý, giá trị trong paths array là tự động sử dụng cả hai namespace và file paths.
'generator'=>[
'basePath'=>app_path(),
'rootNamespace'=>'App\\',
'paths'=>[
'models' => 'Entities',
'repositories' => 'Repositories',
'interfaces' => 'Repositories',
'transformers' => 'Transformers',
'presenters' => 'Presenters',
'validators' => 'Validators',
'controllers' => 'Http/Controllers',
'provider' => 'RepositoryServiceProvider',
'criteria' => 'Criteria',
]
]
Bạn có thể lưu lại thư mục gốc của project bên ngoài app và thêm namespace khác vào, ví dụ như
...
'generator'=>[
'basePath' => base_path('src/Lorem'),
'rootNamespace' => 'Lorem\\'
]
Ngoài ra, bạn có thể tùy chỉnh nơi các lớp mà bạn tạo ra. Điều đó có thể được thực hiện bằng cách chỉnh sửa các đường dẫn theo ý thích của bạn. Ví dụ:
'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',
]
]
Để thực hiện mọi thứ bạn cần cho model của bạn, chúng ta chạy lệnh: php artisan make:entity Post
. Lệnh này sẽ tạo các class Controller, Validator, Model, Resitory, Presenter và Transformer. Và nó cũng tạo một service provider cho phép chúng ta bind Eloquent Repository với một Repository Interface mà nó implement. Để chạy chúng, thêm vào AppServiceProvider
ở method register
$this->app->register(RepositoryServiceProvider::class);
Hoặc bạn có thể bỏ qua các bước trên vào tạo một repository cho model bằng lệnh : php artisan make:repository Post
. Hoặc chỉ định namespace bạn muốn php artisan make:repository "Blog\Post"
.
Tạo các filable sẽ tương tác với repository php artisan make:repository "Blog\Post" --fillable="title,content"
.
Để thêm các validations rule mà bạn cần bạn có thể thêm option --rule
và tạo migrations như sau : php artisan make:entity Cat --fillable="title:string,content:text" --rules="title=>required|min:2, content=>sometimes|min:10
. Câu lệnh này sẽ tạo cho bạn một RESTfull controller và bạn chỉ việc thêm dòng này vào routes của bạn, như vậy bạn đã có một CRUD cơ bạn
Route::resource('cats', CatsController::class);
Khi chạy lệnh này, bạn sẽ tạo thư mục
Entities
vàRepositories
bên trong thư mục mặc định mà bạn đã tạo. Kết thúc, bạn chỉ việc bind interface cho repository, ví dụ trong Repositories Service Provider.
App::bind('{YOUR_NAMESPACE}Repositories\PostRepository', '{YOUR_NAMESPACE}Repositories\PostRepositoryEloquent');
Và dùng method
public function __construct({YOUR_NAMESPACE}Repositories\PostRepository $repository){
$this->repository = $repository;
}
Ngoài ra, bạn có thể sử dụng lệnh artisan
để bind php artisan make:bindings Cats
Sau đây, chúng ta hãy xem cách sử dụng nào
namespace App\Http\Controllers;
use App\PostRepository;
class PostsController extends BaseController {
/**
* @var PostRepository
*/
protected $repository;
public function __construct(PostRepository $repository){
$this->repository = $repository;
}
....
}
Tìm tất cả result trong repository
$posts = $this->repository->all();
Tim kiếm result bằng id$posts = $this->repository->paginate($limit = null, $columns = ['*']);
Tạo 1 record$post = $this->repository->create( Input::all() );
Update in Repository$post = $this->repository->update( Input::all(), $id );
Xóa 1 result bằng id$this->repository->delete($id);
...Và còn nhiều hàm nữa, các bạn có thể tham khảo thêm tại đây https://github.com/andersao/l5-repository Hiện tại mình chỉ nêu lênh cách sử dụng và import packet
All Rights Reserved