首页 > 后端开发 > 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
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板