Laravel アプリケーションで複数の CRUD 操作を管理することは、特に増え続けるモデルを処理する場合には、大変な作業になる可能性があります。この投稿では、単一のコントローラーで既存および将来の CRUD 操作を処理できるようにする汎用 CRUD コントローラー の作成について説明します。
汎用コントローラーは次のような用途に役立ちます。
実装を段階的に見ていきましょう!
新しいコントローラーを作成することから始めます:
php artisan make:controller GenericController
任意のモデルの 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.']); } }
動的エンドポイントを使用するようにルートを構成します:
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'); });
各モデルに次の機能があることを確認してください。
投稿モデルの例:
namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; class Post extends Model { use HasFactory; protected $fillable = ['title', 'content']; }
これは次のような場合に最適です:
より複雑なビジネス ロジックの場合は、専用のコントローラーが必要になる場合があります。
以上がLaravel で複数のリソース用の汎用 CRUD コントローラーを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。