12/08/2018, 14:33

Cài đặt và sử dụng I5-repository

**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ờ ...

**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 file config/app.php thêm vào PrettusRepositoryProvidersRepositoryServiceProvider::class ở providers

'providers' => [
    ...
    PrettusRepositoryProvidersRepositoryServiceProvider::class,
],

Đăng ký Luman $app->register(PrettusRepositoryProvidersLumenRepositoryServiceProvider::class); Tiếp tục, chúng ta chạy lệnh php artisan vendor:publish Công việc tiếp theo các bạn sẽ tạo repository

namespace App;

use PrettusRepositoryEloquentBaseRepository;

class PostRepository extends BaseRepository {

    /**
     * Specify Model class name
     *
     * @return string
     */
    function model()
    {
        return "AppPost";
    }
}

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'=>'RepositoriesEloquent',
            'interfaces'=>'ContractsRepositories',
            '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 "BlogPost". Tạo các filable sẽ tương tác với repository php artisan make:repository "BlogPost" --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}RepositoriesPostRepository', '{YOUR_NAMESPACE}RepositoriesPostRepositoryEloquent');

Và dùng method

public function __construct({YOUR_NAMESPACE}RepositoriesPostRepository $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 AppHttpControllers;

use AppPostRepository;

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

0