ホームページ > バックエンド開発 > PHPチュートリアル > Laravel で複数のリソース用の汎用 CRUD コントローラーを構築する方法

Laravel で複数のリソース用の汎用 CRUD コントローラーを構築する方法

Linda Hamilton
リリース: 2025-01-06 16:11:41
オリジナル
868 人が閲覧しました

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: コントローラー ロジックの作成

任意のモデルの CRUD 操作を処理するように GenericController を設計する方法は次のとおりです。

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.']);
    }
}
ログイン後にコピー

ステップ 3: 動的ルーティング

動的エンドポイントを使用するようにルートを構成します:

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 プロパティ。

投稿モデルの例:

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 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート