Laravel中Route::controller分组内使用Route::resource避免重复指定控制器
Laravel路由优化:避免重复指定控制器类
你的路由代码如下:
Route::controller(AlquilerController::class)->group(function ($hola) { //Debug lines error_log("This"); error_log(get_class($this)); //Illuminate\Routing\RouteFileRegistrar. error_log("hola"); error_log(get_class($hola)); //Illuminate\Routing\Router. Route::get('alquileres/busqueda', 'busqueda')->name('alquileres.busqueda'); Route::get('alquileres/busqueda_texto', 'busquedaTexto')->name('alquileres.busqueda_texto'); Route::middleware('auth')->get('alquileres/mis_alquileres', 'mis_alquileres')->name('alquileres.mis_alquileres'); Route::post('/alquileres/filter_texto', 'filterTexto')->name('alquileres.filter_texto'); Route::get('/alquileres/filter_texto', 'filterTexto')->name('alquileres.filter_texto_url'); Route::post('/alquileres/filter', 'filter')->name('alquileres.filter'); Route::get('/alquileres/filter', 'filter')->name('alquileres.filter_url'); Route::resource('alquileres',AlquilerController::class)->parameters(['alquileres' => 'alquiler']); });
你提到的冗余问题确实存在——Route::controller()和Route::resource()里重复写了AlquilerController::class。由于Route::controller()仅为分组内的单动作方法路由(比如get('xxx', 'method'))提供控制器上下文,Route::resource()并不会自动继承这个上下文,所以可以用以下方法避免重复:
解决方案:定义控制器变量复用
把控制器类赋值给一个变量,然后在两个位置复用这个变量,只需要写一次控制器类名:
$alquilerController = AlquilerController::class; Route::controller($alquilerController)->group(function () use ($alquilerController) { //Debug lines error_log("This"); error_log(get_class($this)); //Illuminate\Routing\RouteFileRegistrar. error_log("hola"); error_log(get_class($hola)); //Illuminate\Routing\Router. Route::get('alquileres/busqueda', 'busqueda')->name('alquileres.busqueda'); Route::get('alquileres/busqueda_texto', 'busquedaTexto')->name('alquileres.busqueda_texto'); Route::middleware('auth')->get('alquileres/mis_alquileres', 'mis_alquileres')->name('alquileres.mis_alquileres'); Route::post('/alquileres/filter_texto', 'filterTexto')->name('alquileres.filter_texto'); Route::get('/alquileres/filter_texto', 'filterTexto')->name('alquileres.filter_texto_url'); Route::post('/alquileres/filter', 'filter')->name('alquileres.filter'); Route::get('/alquileres/filter', 'filter')->name('alquileres.filter_url'); Route::resource('alquileres', $alquilerController)->parameters(['alquileres' => 'alquiler']); });
这种方式既保持了路由结构的完整性,又彻底消除了重复代码,是最直接高效的方案。
内容的提问来源于stack exchange,提问作者Leandro Caplan
相关产品推荐
相关产品推荐

