使用 Repository 設計模式封裝通用的 CURD

laradocs發表於2021-11-14

前言

在逛社群的時候,我看見了 有封裝通用CURD的必要麼(優缺點),想問下你們日常是怎麼處理重複的CURD場景 這個提問,我覺得挺有意思。
然後還有 小李世界Repository 設計模式上手體驗 這篇博文。
實際上可以把 Repository 理解成: Repository 要做的就是 CURD。
當然,如果要逼格更高的話,可以稍加改進。
廢話不多說,我們就直接開始了。

快速開始

我們可以使用 make:repository 命令快速生成一些檔案:

php make:repository UserRepository

執行之後將會生成以下目錄:

- app
+   - Repositories
+       - EloquentUserRepository.php
+       - UserRepository.php

現在,讓我們來看看 EloquentUserRepository.phpUserRepository.php 檔案裡面分別生成了哪些內容:

app/Repositories/EloquentUserRepository.php

<?php

namespace App\Repositories;

use App\Models\User;

class EloquentUserRepository implements UserRepository
{
    //
}

app/Repositories/UserRepository.php

<?php

namespace App\Repositories;

interface UserRepository
{
    //
}

嗯,很好,既快捷又方便。

如果你想知道 make:repository 命令是怎麼來的,可以看看這篇文章:使用 make:service 命令快速生成 Services

當然,也可以手動建立上面那些檔案。我就是手動建立的,沒想到吧!哈哈哈哈哈哈?

開個玩笑,我確實是手動建立的。?

好了,接下來我們就把這兩個檔案填充一下吧。

填充 UserRepository.php 檔案

這裡就不多介紹了,直接一把梭哈。

app/Repositories/UserRepository.php

<?php

namespace App\Repositories;

interface UserRepository
{
    public function findById ( int $id );
}

填充 EloquentUserRepository.php 檔案

我們要確保有對應的模型。沒錯,這個檔案就是用來做 CURD 操作的。

app/Repositories/EloquentUserRepository.php

<?php

namespace App\Repositories;

use App\Models\User;

class EloquentUserRepository implements UserRepository
{
    protected $user;

    public function __construct ( User $user )
    {
        $this->user = $user;
    }

    public function findById(int $id)
    {
        return $this->user->findOrFail ( $id );
    }
}

繫結 UserRepository 和 EloquentUserRepository

我們可以執行以下命令快速建立一個 RepositoryServiceProvider.php 檔案:

php artisan make:provider RepositoryServiceProvider

接下來,我們需要在 RepositoryServiceProvider.php 檔案裡面繫結 UserRepositoryEloquentUserRepository 類:

<?php

namespace App\Providers;

use Illuminate\Support\ServiceProvider;

class RepositoryServiceProvider extends ServiceProvider
{
    /**
     * Register services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind (
            'App\Repositories\UserRepository',
            'App\Repositories\EloquentUserRepository'
        );
    }
    .
    .
    .
}

最後,我們只需把 RepositoryServiceProvider 服務新增到 app.php 中的 providers 陣列裡面就可以了:

return [
    .
    .
    .
    'providers' => [
        .
        .
        .
        /*
         * Application Service Providers...
         */
        ...

        App\Providers\RepositoryServiceProvider::class,

    ];
    .
    .
    .
];

快速演示

開始演示之前,我們需確保以下條件是否滿足:

  • app/Providers/RouteServiceProvider.php 檔案中第 29 行註釋已取消。
  • .env 資料庫配置全部正確。

我們需要建立一個 UserController.php 檔案:
執行以下命令快速生成:

php artisan make:controller UserController

接著,我們需要在 UserController.php 新增一些內容,如下所示:

<?php

namespace App\Http\Controllers;

use App\Repositories\UserRepository;
use Illuminate\Http\Request;

class UserController extends Controller
{
    protected $users;

    public function __construct ( UserRepository $users ) {
        $this->users = $users;
    }

    public function show ( $id )
    {
        return $this->users->findById($id);
    }
}

接下來,我們只需在 web.php 檔案中新增控制器相關路由即可:

routes/web.php

Route::get ( 'users/{id}', 'UserController@show' );

最後,在瀏覽器訪問路由。

Laravel

我們可以看到結果是正常顯示的。

我們已經完成了 Repository 的全部過程。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
站在巨人的肩上。

相關文章