前言
在逛社群的時候,我看見了 有封裝通用CURD的必要麼(優缺點),想問下你們日常是怎麼處理重複的CURD場景
這個提問,我覺得挺有意思。
然後還有 小李世界 的 Repository 設計模式上手體驗 這篇博文。
實際上可以把 Repository 理解成: Repository 要做的就是 CURD。
當然,如果要逼格更高的話,可以稍加改進。
廢話不多說,我們就直接開始了。
快速開始
我們可以使用 make:repository
命令快速生成一些檔案:
php make:repository UserRepository
執行之後將會生成以下目錄:
- app
+ - Repositories
+ - EloquentUserRepository.php
+ - UserRepository.php
現在,讓我們來看看 EloquentUserRepository.php
和 UserRepository.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
檔案裡面繫結 UserRepository
和 EloquentUserRepository
類:
<?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' );
最後,在瀏覽器訪問路由。
我們可以看到結果是正常顯示的。
我們已經完成了 Repository 的全部過程。
本作品採用《CC 協議》,轉載必須註明作者和本文連結