Laravel跨控制器处理表单存储及获取房屋ID问题咨询
提交无响应的直接原因
两个视图配置错误导致点击按钮无反应:
- 表单
action属性为空,没有指定提交的目标地址 - 提交按钮
type属性设置为button,该类型按钮默认不会触发表单提交逻辑
跨控制器处理请求的可行性说明
Laravel完全支持不同控制器分别负责视图渲染、表单存储的实现方式,这是符合框架设计规范的常规分层写法,你当前拆分House控制器和Booking控制器的思路没有问题,不需要调整整体架构。
获取对应房屋ID的实现步骤
你已经在POST路由中定义了{house}路径参数,按以下步骤调整即可正常拿到ID并完成提交:
- 第一步:为预订存储路由添加名称(推荐,后续维护更方便)
修改routes/web.php中的对应路由:Route::post('house/{house}', [\App\Http\Controllers\BookingController::class, 'store'])->name('booking.store'); - 第二步:修复视图中的表单配置
将房屋详情视图里的表单部分替换为以下代码,补全提交地址,同时修正按钮类型:
如果不想给路由命名,也可以直接写路径格式:<form method="POST" action="{{ route('booking.store', $house) }}"> @csrf <input type="date" name="begin" required> <input type="date" name="end" required> <div class="col-md-12 bg-light mt-3"> <button type="submit" class="btn btn-warning ml-2">提交申请</button> </div> </form>action="/house/{{ $house->id }}" - 第三步:调整Booking控制器的store方法,接收路由参数
你之前写的$request->id无法拿到房屋ID,因为表单中没有传递名为id的字段,正确做法是通过路由模型绑定直接注入对应房屋实例:<?php namespace App\Http\Controllers; use App\Models\Booking; use App\Models\House; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class BookingController extends Controller { public function store(Request $request, House $house) { // 建议增加参数校验,避免非法数据入库 $validated = $request->validate([ 'begin' => 'required|date', 'end' => 'required|date|after:begin', ]); Booking::create([ 'user_id' => Auth::id(), 'house_id' => $house->id, // 直接从路由绑定的房屋实例取ID 'begin' => $validated['begin'], 'end' => $validated['end'], 'status' => 0 ]); return redirect('/'); } // 其余方法保持不变 }
额外提醒
记得给Booking模型设置$fillable属性,允许批量赋值user_id、house_id、begin、end、status字段,否则会出现MassAssignmentException报错。
内容的提问来源于stack exchange,提问作者max123
相关产品推荐
相关产品推荐

