Gérer plusieurs opérations CRUD dans une application Laravel peut s'avérer écrasant, en particulier lors de la gestion d'un nombre croissant de modèles. Dans cet article, je vais vous guider dans la création d'un contrôleur CRUD générique qui vous permet de gérer les opérations CRUD existantes et futures dans un seul contrôleur.
Un contrôleur générique aide :
Plongeons dans la mise en œuvre étape par étape !
Commencez par créer un nouveau contrôleur :
php artisan make:controller GenericController
Voici comment concevoir votre GenericController pour gérer les opérations CRUD pour n'importe quel modèle :
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.']); } }
Configurez vos itinéraires pour utiliser des points de terminaison dynamiques :
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'); });
Assurez-vous que chaque modèle possède :
Exemple pour un modèle 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']; }
C'est idéal pour :
Pour une logique métier plus complexe, vous aurez peut-être encore besoin de contrôleurs dédiés.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!