Laravel中打开指定ID页面遇404?问题排查与解决
问题原因与解决方案
核心问题:路由不匹配
Laravel 的 Route::resource('/tickets', TicketsController::class) 生成的标准路由中,create 方法对应的 URL 是 GET /tickets/create,不带任何路径参数。你访问的 /tickets/create/1 不符合这个路由规则,所以返回 404。
另外你的 Blade 视图和控制器也存在逻辑问题,下面一步步修复:
1. 调整路由,支持带 ID 的 create 请求
在原有 resource 路由前添加自定义路由(必须放在 resource 路由前面,否则会被无参数的 create 路由覆盖):
// 带 ID 的 create 路由,命名方便后续生成链接 Route::get('/tickets/create/{id}', [TicketsController::class, 'create'])->name('tickets.create'); // 保留原有 resource 路由 Route::resource('/tickets', TicketsController::class);
2. 修改控制器方法,接收并使用 ID
更新 create 方法,添加参数接收逻辑,同时优化视图数据传递的写法:
public function create($id) { // 根据 ID 获取对应数据(注意:你的 $users 变量是从 tickets 表取的,命名不符合语义,建议改成对应表,比如 User::find($id)) $targetTicket = DB::table('tickets')->find($id); // 原有数据查询逻辑 $ticketsinfos = Tickets::with('companies')->get(); $tickets = Companies::with('tickets')->get(); $severities = Severities::with('severity')->get(); $ticketscounts = Tickets::count(); $users = DB::table('tickets')->get(); // 用 compact 简化数据传递 return view('customer.index', compact('tickets', 'severities', 'ticketsinfos', 'ticketscounts', 'users', 'targetTicket')); }
3. 修复 Blade 视图的逻辑错误
原视图存在两个问题:嵌套 @foreach($users) 会生成多个 <td> 导致表格结构错乱,以及多余的 </tr> 标签。修改后:
@foreach ($ticketsinfos as $ticketinfo) <tr> <td>IR-173049</td> <td>Tudro</td> <td>{{ $ticketinfo->companies->name }}</td> <!-- 用 route 函数生成可靠链接,传递当前工单的 ID --> <td><a href="{{ route('tickets.create', $ticketinfo->id) }}">{{ Str::limit($ticketinfo->ticket_title, 50, '...') }}</a></td> <td><button class="btn btn-danger btn-sm" type="button">Action Needed<br></button><br></td> <td>Tako Kiknadze</td> <td>{{ $ticketinfo->created_at }}</td> <td>{{ $ticketinfo->updated_at }}</td> </tr> @endforeach
额外提醒
你代码中 $users = DB::table('tickets')->get(); 的命名不符合语义,$users 应该对应用户表(比如 User::get()),如果是要获取工单数据,建议改成 $ticketsList = DB::table('tickets')->get();,避免逻辑混淆。
内容的提问来源于stack exchange,提问作者user18966513
相关产品推荐
相关产品推荐

