首頁 > 後端開發 > php教程 > 如何在 Laravel 中為多種資源建立通用 CRUD 控制器

如何在 Laravel 中為多種資源建立通用 CRUD 控制器

Linda Hamilton
發布: 2025-01-06 16:11:41
原創
815 人瀏覽過

How to Build a Generic CRUD Controller in Laravel for Multiple Resources

如何在 Laravel 中為多種資源建立通用 CRUD 控制器

在 Laravel 應用程式中管理多個 CRUD 操作可能會讓人不知所措,尤其是在處理越來越多的模型時。在這篇文章中,我將指導您建立一個通用 CRUD 控制器,它允許您在單一控制器中處理現有和未來的 CRUD 操作。

為什麼要使用通用控制器?

通用控制器可以幫助:

  • 盡量減少重複程式碼。
  • 讓新增新機型變得輕而易舉。
  • 為您的應用程式提供一致的結構。

讓我們一步步深入實作!


第 1 步:設定控制器

先建立一個新控制器:

php artisan make:controller GenericController
登入後複製

步驟2:編寫控制器邏輯

以下是如何設計 GenericController 來處理任何模型的 CRUD 操作:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Str;

class GenericController extends Controller
{
    protected function getModel($modelName)
    {
        $modelClass = 'App\Models\' . Str::studly($modelName);

        if (!class_exists($modelClass)) {
            abort(404, "Model $modelName not found.");
        }

        return new $modelClass;
    }

    public function index($model)
    {
        $modelInstance = $this->getModel($model);
        return response()->json($modelInstance::all());
    }

    public function show($model, $id)
    {
        $modelInstance = $this->getModel($model);
        return response()->json($modelInstance::findOrFail($id));
    }

    public function store(Request $request, $model)
    {
        $modelInstance = $this->getModel($model);
        $data = $request->validate($modelInstance->getFillable());
        $created = $modelInstance::create($data);

        return response()->json($created, 201);
    }

    public function update(Request $request, $model, $id)
    {
        $modelInstance = $this->getModel($model);
        $item = $modelInstance::findOrFail($id);
        $data = $request->validate($modelInstance->getFillable());
        $item->update($data);

        return response()->json($item);
    }

    public function destroy($model, $id)
    {
        $modelInstance = $this->getModel($model);
        $item = $modelInstance::findOrFail($id);
        $item->delete();

        return response()->json(['message' => 'Deleted successfully.']);
    }
}
登入後複製

第三步:動態路由

設定您的路由以使用動態端點:

use App\Http\Controllers\GenericController;

Route::controller(GenericController::class)->prefix('api/{model}')->group(function () {
    Route::get('/', 'index'); 
    Route::get('/{id}', 'show'); 
    Route::post('/', 'store'); 
    Route::put('/{id}', 'update'); 
    Route::delete('/{id}', 'destroy'); 
});
登入後複製

第 4 步:準備模型

確保每個模型都有:

  • 一個 $fillable 屬性,用於指定可批次分配的欄位。

Post 模型範例:

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['title', 'content'];
}

登入後複製

主要優勢

  • 可擴充性:僅透過新增模型檔案即可輕鬆處理新模型。
  • 程式碼可重複使用性:減少冗餘。
  • 簡化維護:專注於業務邏輯,無需擔心樣板程式碼。

何時使用此方法?

這非常適合:

  • 具有標準 CRUD 邏輯的應用程式。
  • 模型共享共同行為的項目。

對於更複雜的業務邏輯,您可能仍需要專用的控制器。

以上是如何在 Laravel 中為多種資源建立通用 CRUD 控制器的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板