Laravel 8预订日历报错:Target class [FrontendController]不存在
Laravel 8 预订日历功能报错:Target class [FrontendController] does not exist
错误详情
点击「预订」按钮后触发以下错误:
Illuminate\Contracts\Container\BindingResolutionException
Target class [FrontendController] does not exist.
请求地址:http://localhost/testowa7/public/makeReservation/26/5
相关代码
Room Blade 视图代码
<form action="{{ route('makeReservation',['room_id'=>$room->id,'city_id'=>$room->object->city->id]) }}" method="POST"> <div class="form-group"> <label for="dayin">入住日期</label> <input required name="dayin" type="text" class="form-control datepicker" id="dayin" placeholder=""> </div> <div class="form-group"> <label for="dayout">退房日期</label> <input required name="dayout" type="text" class="form-control datepicker" id="dayout" placeholder=""> </div> <button type="submit" class="btn btn-primary">预订</button> <p class="text-danger">{{ Session::get('reservationMsg') }}</p> {{ csrf_field() }} </form>
路由代码
Route::post('/makeReservation/{room_id}/{city_id}','FrontendController@makeReservation')->name('makeReservation');
FrontendController 代码
public function makeReservation($room_id, $city_id, Request $request) { $avaiable = $this->fG->checkAvaiableReservations($room_id,$request); if(!$avaiable) { if(!$request->ajax()) // 非APP环境下使用 { $request->session()->flash('reservationMsg',_('无可用房间')); return redirect()->route('room',['id'=>$room_id,'#reservation']); } return response()->json(['reservation'=>false]); // APP环境下使用 } else { $reservation = $this->fG->makeReservation($room_id,$city_id,$request); if(!$request->ajax()) return redirect()->route('adminHome'); else return response()->json(['reservation'=>$reservation]); } }
FrontendRepository 代码
public function makeReservation($room_id, $city_id, $request) { return Reservation::create([ 'user_id' => $request->user()->id, 'city_id' => $city_id, 'room_id' => $room_id, 'status' => 0, 'dayin' => $request->input('dayin'), 'dayout' => $request->input('dayout'), ]); }
FrontendGateway 代码
public function checkAvaiableReservations($room_id,$request) { $reservations = $this->fR->getReservationsByRoomId($room_id); $avaiable = true; foreach($reservations as $reservation) { if( $request->input('dayin') >= $reservation->day_in && $request->input('dayin') <= $reservation->day_out ) { $avaiable =false;break; } elseif( $request->input('dayout') >= $reservation->day_in && $request->input('dayout') <= $reservation->day_out ) { $avaiable =false;break; } if( $request->input('dayin') >= $reservation->day_in && $request->input('dayout') <= $reservation->day_out ) { $avaiable =false;break; } } return $avaiable; } public function makeReservation($room_id, $city_id, $request) { $this->validate($request, [ 'dayin' => "required|string", 'dayout' => "required|string", ]); return $this->fR->makeReservation($room_id, $city_id, $request); }
解决方案
Laravel 8 取消了路由默认的控制器命名空间,直接用'FrontendController@makeReservation'这种字符串写法会找不到类,可通过以下两种方式解决:
使用完全限定类名
确认FrontendController的命名空间(通常为App\Http\Controllers),修改路由代码:use App\Http\Controllers\FrontendController; Route::post('/makeReservation/{room_id}/{city_id}', [FrontendController::class, 'makeReservation'])->name('makeReservation');恢复默认命名空间
在app/Providers/RouteServiceProvider.php中取消注释protected $namespace = 'App\\Http\\Controllers';,然后在路由文件中用命名空间分组包裹路由:// RouteServiceProvider.php中 protected $namespace = 'App\\Http\\Controllers'; // 对应路由文件中 Route::group(['namespace' => $this->namespace], function () { Route::post('/makeReservation/{room_id}/{city_id}','FrontendController@makeReservation')->name('makeReservation'); // 其他路由... });
额外检查:确认FrontendController文件放在app/Http/Controllers目录下,类名与文件名大小写一致(Laravel对类名大小写敏感)。
内容的提问来源于stack exchange,提问作者Weronika Piotrowicz
相关产品推荐
相关产品推荐

