如何在 Laravel 中为多种资源构建通用 CRUD 控制器
在 Laravel 中,为多种资源构建通用的 CRUD 控制器可以通过以下方法实现,这不仅能减少代码重复,还能提高代码的可维护性。
创建一个通用的 CRUD 控制器,支持多个资源(如 Post, User, Product 等),并确保易于扩展和维护。
在命令行中运行以下命令:
php artisan make:controller GenericController
编辑 GenericController,实现基本 CRUD 功能:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
class GenericController extends Controller
{
protected $model; // 动态绑定模型
public function index()
{
// 获取所有资源
return response()->json($this->model::all());
}
public function show($id)
{
// 获取单个资源
$item = $this->model::findOrFail($id);
return response()->json($item);
}
public function store(Request $request)
{
// 验证并创建资源
$validatedData = $request->validate($this->model::validationRules());
$item = $this->model::create($validatedData);
return response()->json($item, 201);
}
public function update(Request $request, $id)
{
// 验证并更新资源
$item = $this->model::findOrFail($id);
$validatedData = $request->validate($this->model::validationRules());
$item->update($validatedData);
return response()->json($item);
}
public function destroy($id)
{
// 删除资源
$item = $this->model::findOrFail($id);
$item->delete();
return response()->json(['message' => 'Deleted successfully'], 204);
}
}
假设我们有一个 Post 模型和一个 Product 模型。
运行命令生成资源模型:
php artisan make:model Post -m
php artisan make:model Product -m
创建 PostController 和 ProductController 并继承 GenericController:
namespace App\Http\Controllers;
use App\Models\Post;
class PostController extends GenericController
{
public function __construct()
{
$this->model = Post::class;
}
}
namespace App\Http\Controllers;
use App\Models\Product;
class ProductController extends GenericController
{
public function __construct()
{
$this->model = Product::class;
}
}
在 Post 和 Product 模型中添加静态方法 validationRules:
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Post extends Model
{
use HasFactory;
protected $fillable = ['title', 'content'];
public static function validationRules()
{
return [
'title' => 'required|string|max:255',
'content' => 'required|string',
];
}
}
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Product extends Model
{
use HasFactory;
protected $fillable = ['name', 'price', 'description'];
public static function validationRules()
{
return [
'name' => 'required|string|max:255',
'price' => 'required|numeric|min:0',
'description' => 'nullable|string',
];
}
}
在 routes/api.php 中为每个资源注册路由:
use App\Http\Controllers\PostController;
use App\Http\Controllers\ProductController;
Route::apiResource('posts', PostController::class);
Route::apiResource('products', ProductController::class);
Laravel 提供了一个基础的 Controller,可以通过继承和自定义来实现通用功能。
运行以下命令生成控制器:
php artisan make:controller BaseResourceController
编辑 BaseResourceController:
namespace App\Http\Controllers;
use Illuminate\Http\Request;
abstract class BaseResourceController extends Controller
{
abstract protected function model();
public function index()
{
return response()->json($this->model()::all());
}
public function show($id)
{
return response()->json($this->model()::findOrFail($id));
}
public function store(Request $request)
{
$validatedData = $request->validate($this->model()::validationRules());
return response()->json($this->model()::create($validatedData), 201);
}
public function update(Request $request, $id)
{
$item = $this->model()::findOrFail($id);
$validatedData = $request->validate($this->model()::validationRules());
$item->update($validatedData);
return response()->json($item);
}
public function destroy($id)
{
$item = $this->model()::findOrFail($id);
$item->delete();
return response()->json(['message' => 'Deleted successfully'], 204);
}
}
例如,创建 PostController 和 ProductController:
namespace App\Http\Controllers;
use App\Models\Post;
class PostController extends BaseResourceController
{
protected function model()
{
return Post::class;
}
}
namespace App\Http\Controllers;
use App\Models\Product;
class ProductController extends BaseResourceController
{
protected function model()
{
return Product::class;
}
}
两种方法都可以实现通用 CRUD 控制器:
选择哪种方法取决于项目的复杂性和开发团队的偏好。
2025 年陆剧市场依旧热度爆棚
时间:2025-09-19
阵地央一首播:年度高品质大剧,深度解锁文化抗战三重非凡意义
时间:2025-09-18
陈展鹏刘佩玥《巨塔之后》今首播
时间:2025-08-28
生万物大结局惊现最招恨角色,原来真正的坏都披着善的“羊皮”!
时间:2025-08-28
归队6集燃爆:袁姗姗化身“战地玫瑰”,实战军医双在线超吸睛!
时间:2025-08-28
许凯田曦薇新剧《子夜归》首播,点击率位列第七
时间:2025-08-21