+4

Repository pattern trong Laravel

Repository pattern là gì?

Repository design pattern là một trong những mẫu thiết kế hữu ích nhất và được áp dụng rộng rãi nhất. Repository pattern rất hữu ích cho bạn để giữ cho code của bạn sạch hơn và dễ đọc hơn.

Không làm việc với Repositories Sử dụng repositories là không bắt buộc! Bạn có thể xây dựng ứng dụng của mình mà không cần sử dụng mẫu này, tuy nhiên, theo thời gian, bạn có thể tự dồn mình vào một góc. Repository interface có thể tái sử dụng. Chúng có thể được sử dụng trong các lớp logic khác mà không thay đổi điều gì. Ví dụ: bằng cách chọn không sử dụng kho lưu trữ, ứng dụng của bạn không dễ dàng được kiểm tra và việc thay đổi triển khai sẽ rất cồng kềnh. Hãy xem một ví dụ.

Ví dụ không dùng repository

 
class PostController {
 
 
public function index()
{
    $posts = Post::all();

    return view('posts.index', compact('posts'));
}


public function create()
{
    return view('posts.create');
}


public function show($id)
{
    $post = Post::find($id);

    return view('posts.show', compact('post'));
}
}

Đây sẽ là mã khá điển hình để sử dụng Eloquent để tương tác với cơ sở dữ liệu chứa danh sách các bài viết. Nó sẽ hoạt động tốt, nhưng controller được gắn chặt với Eloquent. Thay vào đó, chúng ta có thể thêm một repo để tạo ra một phiên bản được ghép lỏng lẻo của cùng một đoạn code. Điểu này giúp dễ dàng thay đổi việc thực hiện sau đó.

Làm việc với repository

1. Tạo interface

Tạo interface sẽ xác định contract mà repository phải thực hiện. Dưới đây là ví dụ, mình tạo một PostRepositoryInterface.

<?php

namespace App\Repositories\Interfaces;

interface PostRepositoryInterface
{
    public function getAll();

    public function getById($id);

    public function create($attribute);

    public function update($id, array $attribute);

    public function delete($id);
}

2. Tạo repository

Mình tạo một file là PostRepository, trong này sẽ chứa code logic, tất cả các truy vấn đến cơ sở dữ liệu mình sẽ viết trong đây. Các câu truy vấn Eloquent bất kể phức tạp thế nào, mỗi phương thức chỉ cần có một tên tùy chỉnh để trong controller, chúng tôi chỉ cần viết một số mã rất ngắn để có được kết quả mong muốn.

<?php
namespace App\Repositories\Eloquents;
 
use Post;
 
class PostRepository implements PostRepositoryInterface {
	
	private $model;

    public function __construct(Post $model)
    {
        $this->model = $model;
    }

    public function getAll()
    {
        return $this->model->all();
    }

    public function getById($id)
    {
        return $this->model->findOrFail($id);
    }

    public function create($attribute)
    {
        $student = Post::where('post_id', $attribute['post_id'])->first();

        if (isset($post)) {
            return $post->update($attribute);
        } else {
            return $this->model->create($attribute);
        }
    }

    public function delete($id)
    {
        $this->getById($id)->delete();

        return true;
    }
}

3. Đăng kí vào AppServiceProvider

<?php

namespace App\Providers;

use App\Models\Post;
use App\Repositories\Interfaces\PostRepositoryInterface;
use App\Repositories\Eloquents\PostRepository;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
    }

    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind(PostRepositoryInterface::class, PostRepository::class);
    }
}

4. Xử lí trong controller

<?php

namespace App\Http\Controllers;

use App\Repositories\Interfaces\PostRepositoryInterface;
use App\Http\Requests\PostFormRequest;

class PostController extends Controller
{
    private $post;

    public function __construct(PostRepositoryInterface $post)
    {
        $this->post = $post;
        view()->share('post', $post);
    }

    public function showCreateForm()
    {
        return view('subjects.create');
    }

    public function create(PostFormRequest $request)
    {
        $attribute = $request->all();
        $this->post->create($attribute);

        return redirect()->back()->with('status', __('Created success'));
    }

    public function getAllPosts()
    {
        $posts = $this->post->getAll();

        return view('posts.index')->with(['posts' => $posts]);
    }

    public function delete($id)
    {
        $this->post->delete($id);

        return redirect()->back()->with('status', __('Delete successfully'));;
    }

Tài liệu tham khảo


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí