12/08/2018, 14:13

CURD với Repository trong Laravel 5 (Part 1)

1. Giới thiệu về Repository Mình sẽ không đi sâu vào giới thiệu về Repository Pattern nữa vì đã có nhiều bài giới thiệu khá đầy đủ về nó rồi. Các bạn có thể thao khao một số bài viết sau: Laravel Design Patterns Series: Repository Pattern - Nguyen Thanh Tung Using Repository Pattern in ...

1. Giới thiệu về Repository

Mình sẽ không đi sâu vào giới thiệu về Repository Pattern nữa vì đã có nhiều bài giới thiệu khá đầy đủ về nó rồi. Các bạn có thể thao khao một số bài viết sau:

  • Laravel Design Patterns Series: Repository Pattern - Nguyen Thanh Tung
  • Using Repository Pattern in Laravel 5
  • Github

2. CURD với theo Repository trong laravel 5

Trong bài viết này mình sẽ dựa theo bài viết ở trên của anh Nguyen Thanh Tung. Trong bài viết trên đã hướng dẫn và giải thích một cách chi tiết về cách đặt thư mục và tác dụng của nó. Mình sẽ dùng luôn nhé =)). Mình sẽ đổi từ quản lý product sang quản lý user cho dễ demo nhé.

Đầu tiên là tạo một controller resource là UsersController bằng

 php artisan make:controller UsersController --resource

tiếp theo là một route resource trong routes/web.php

    Route::resource('users', 'UsersController');

Ở đây mình sẽ tạo thêm một file trong thư mục Eloquent tên là BaseRepository.php. Trong file này chứa các các hàm dùng chung như: create, find, update, destroy...

<?php

namespace AppRepositoriesEloquent;

use AppRepositoriesContractsRepositoryInterface;
use IlluminateContainerContainer as App;
use IlluminateDatabaseEloquentModel;

abstract class BaseRepository implements RepositoryInterface
{
    /**
    var
     */
    protected $model;

    /**
     */
    public function __construct(App $app)
    {
        $this->app = $app;
        $this->makeModel();
    }

    /**
     * Retrieve all data of repository
     */
    public function all($columns = ['*'])
    {
        return $this->model->all();
    }

    /**
     * Retrieve all data of repository, paginated
     */
    public function paginate($limit = null, $columns = ['*'])
    {
        $limit = is_null($limit) ? config('repository.pagination.limit', 10) : $limit;

        return $this->model->paginate($limit, $columns);
    }
    /**
     * Find data by id
     */
    public function find($id, $columns = ['*'])
    {
        return $this->model->findOrFail($id, $columns);
    }

    /**
     * Save a new entity in repository
     */
    public function create(array $input)
    {
        return $this->model->create($input);
    }

    /**
     * Update a entity in repository by id
     */
    public function update(array $input, $id)
    {
        $model = $this->model->findOrFail($id);
        $model->fill($input);
        $model->save();

        return $this;
    }
    
    /**
     * Delete a entity in repository by id
     *
     * @param $id
     *
     * @return int
     */
    public function delete($id)
    {
        return $this->model->destroy($id);
    }
}

Sau khi đã có một BaseRepository bạn nên cần một BaseRepositoryInterface trong thư mục Contracts. Trong này khai báo các hàm đã có trong BaseRepository

<?php

namespace AppRepositoriesContracts;

interface RepositoryInterface
{
    /**
     * Retrieve all data of repository
     */
    public function all($columns = ['*']);

     /**
     * Find data by id
     */
    public function find($id, $columns = ['*']);

    public function paginate($limit = null, $columns = ['*']);
    /**
     * Save a new entity in repository
     */
    public function create(array $input);

    public function update(array $input, $id);
    
    public function delete($id)
}

UserRepository sửa đôi chút thành

<?php

namespace AppRepositoriesEloquent;

use AppRepositoriesEloquentBaseRepository;
use AppRepositoriesContractsUserRepositoryInterface;

class UserRepository extends BaseRepository implements UserRepositoryInterface
{
    /**
     * Specify Model class name
     */
    function model()
    {
        return 'AppModelsUser';
    }
}

Quay lại UsersController đã tạo lúc đầu nào =)). Để tạo một thằng user mới thì cần động đến create và store đúng không nào ? Vậy ta có thể viết controller như sau:

<?php

namespace AppHttpControllersAdmin;

use IlluminateHttpRequest;
use AppRepositoriesContractsUserRepositoryInterface as UserRepository;
use AppHttpRequestsUserManage;
use Exception;
use Log;

class UsersController extends BaseController
{
    /**
     * @var Subject
     */
    private $userRepository;

    public function __construct(UserRepository $userRepository) {

        $this->userRepository = $userRepository;
    }

    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        users = $this->userRepository->paginate();

        return view('user.index', compact('users');
    }

    /**
     * Show the form for creating a new resource.
     */
    public function create()
    {
        return view('user.create');
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        try {
            $input = $request->only('name', 'email');
            $input['password'] = '123456';
            $this->userRepository->create($input);
        } catch (Exception $e) {
            Log::debug($e);

            return back()->withErrors('Error'));
        }

        return redirect()->action('UsersController@index')
            ->with('success');
    }

    /**
     * Display the specified resource.
     */
    public function show($id)
    {
        user = $this->userRepository->find($id);

        return view('user.detail', compact('user');
    }

    /**
     * Show the form for editing the specified resource.
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy($id)
    {
        //
    }
}

Đó là phần server, còn phần view khá đơn giản nên mình chỉ lấy ví dụ phần create user thôi nhé. Ta có file create.blade.php như sau:

{!! Form::open(['action' => ['UsersController@store', 'method' => 'POST'],'class' => 'form-horizontal']) !!}
    <div class="form-group">
      {!! Form::label('name', 'Name, ['class' => 'col-sm-2 control-label']) !!}
      <div class="col-sm-10">
         {!! Form::text('name', old('name'), ['class' => 'form-control',]) !!}
      </div>
    </div>
    <div class="form-group">
       {!! Form::label('email', 'Email', ['class' => 'col-sm-2 control-label']) !!}
       <div class="col-sm-10">
          {!! Form::email('email', old('email'), ['class' => 'form-control']) !!}
       </div>
   </div>
   <div class="form-group">
       <div class="col-sm-offset-2 col-sm-10">
           {!! Form::submit(trans('common/buttons.create'), ['class' => 'btn btn-success']) !!}
       </div>
  </div>
{!! Form::close() !!}

Ok! Tạm thời là create, view list và show user. Trong bài sau sẽ là update và delete nhé =)) Bài viết còn nhiều thiếu sót rất mong các bạn bỏ qua.

0