Laravel中如何创建Resource控制器_Laravel资源路由与控制器生成【教程】

使用 php artisan make:controller PostController –resource –model=Post 生成资源控制器后,需手动注册路由、配置模型绑定(隐式或显式)、添加 Form Request 验证类,并确保数据库迁移完成、模型表名正确,否则易出现 MassAssignmentException、空响应或 500 错误。

laravel中如何创建resource控制器_laravel资源路由与控制器生成【教程】

直接用 php artisan make:controller--resource 参数就能生成标准 Resource 控制器,但默认不带模型绑定、不注册路由、不加表单验证——这些得手动补,否则容易在 storeupdate 时遇到 MassAssignmentException 或空请求报错。

如何生成带模型绑定的 Resource 控制器

Laravel 不会自动为 Resource 控制器注入模型实例,必须显式添加类型提示或使用路由模型绑定。生成时加 --model=Post 只是让 Artisan 创建控制器时预填常用方法骨架,并不自动配置绑定逻辑。

  • 运行 php artisan make:controller PostController --resource --model=Post
  • 手动在 routes/web.php 中注册资源路由:
    Route::resource('posts', PostController::class);
  • 若需隐式绑定(如 /posts/123 自动解析为 Post 实例),确保路由参数名与模型名一致(post 而非 id),并在控制器方法中写 public function show(Post $post)
  • 显式绑定更可控:在 RouteServiceProviderboot 方法里加
    Route::model('post', App/Models/Post::class);

Resource 控制器里哪些方法需要手动加验证

storeupdate 方法默认不校验请求数据,提交空字段或非法格式会直接入库或抛出 500 错误。Laravel 8+ 推荐用 Form Request 类,而不是在控制器里写 $request->validate()

  • 生成验证类:php artisan make:request StorePostRequest
  • StorePostRequestrules() 方法里定义规则,例如:
    public function rules()
    {
        return [
            'title' => ['required', 'string', 'max:255'],
            'content' => ['required', 'string'],
        ];
    }
  • 把控制器方法签名改成:public function store(StorePostRequest $request) —— 此时验证自动触发,失败则重定向并返回错误
  • update 同理,用 UpdatePostRequest,注意 unique:posts 规则要排除当前模型:'slug' => ['required', 'unique:posts,slug,' . $post->id]

为什么 index 方法返回空数组却没报错

常见于数据库迁移未运行、表名与模型约定不符、或模型里忘了设 $table 属性。Resource 控制器的 index 方法只是调 Post::all(),它不会主动报错,只安静返回空集合。

  • 检查模型是否指向正确表:protected $table = 'posts';(如果表名不是复数)
  • 确认已运行迁移:php artisan migrate,且表中已有数据
  • index 方法里临时加 dd(Post::query()->toSql()); 看生成的 SQL 是否符合预期
  • 若用 API 资源(PostResource::collection()),还要确认 PostResourcetoArray() 方法没写错字段名,否则可能返回空对象而非空数组

Resource 控制器本身很薄,真正复杂的是模型关系、权限控制(比如谁可以访问 edit)、以及前端如何匹配 create/edit 表单的 CSRF 字段和方法伪装(_method=PUT)。这些不在生成器覆盖范围内,得一个一个对齐。

https://www.php.cn/faq/2027360.html

发表回复

Your email address will not be published. Required fields are marked *