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

直接用 php artisan make:controller 加 --resource 参数就能生成标准 Resource 控制器,但默认不带模型绑定、不注册路由、不加表单验证——这些得手动补,否则容易在 store 或 update 时遇到 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) - 显式绑定更可控:在
RouteServiceProvider的boot方法里加Route::model('post', App\Models\Post::class);
Resource 控制器里哪些方法需要手动加验证
store 和 update 方法默认不校验请求数据,提交空字段或非法格式会直接入库或抛出 500 错误。Laravel 8+ 推荐用 Form Request 类,而不是在控制器里写 $request->validate()。
- 生成验证类:
php artisan make:request StorePostRequest - 在
StorePostRequest的rules()方法里定义规则,例如: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()),还要确认PostResource的toArray()方法没写错字段名,否则可能返回空对象而非空数组
Resource 控制器本身很薄,真正复杂的是模型关系、权限控制(比如谁可以访问 edit)、以及前端如何匹配 create/edit 表单的 CSRF 字段和方法伪装(_method=PUT)。这些不在生成器覆盖范围内,得一个一个对齐。










