在Laravel的开发过程中,有时我们可能会碰到一个问题,那就是在路由中我们会定义一些变量,但这些变量我们又不想带到控制器Controller中,而Laravel在默认情况下又会主动将这些变量传入控制器中。
这时,如果我们想要获取路由Route中后续定义的一些变量,我们就必须先定义一个形参将前面出现的无用变量接收,然后再定义一个形参接收我们需要的变量,这无疑让代码变得极度臃肿,比如:
Route::group(['middleware' => ['web'],'domain' => '{sub}.abc.com'], function () {
Route::get('/test/{id}','TestCtl@test');
})
在这段代码中,出现了2个路由变量{sub}
和{id}
。其中,变量 sub是用来控制子域名的,而变量id则是用来控制路由的id值。
在控制器TestCtl
的方法中,如果想要定义一个$id用来接收路由中的 id 变量,如下:
public function test($id, Request $request)
{
return $id;
})
你会发现,返回的$id
值并不是你预期路径中的{id}
变量,而是先定义的{sub}
变量。如果你真先要得到路径中的变量,你还需要在形参$id
之前定义另一个形参$sub
,如下:
public function test($sub, $id, Request $request)
{
return $id;
})
而且,在该group()
下的所有路由路径,如果带有自定义变量,那么都需要这般处理,非常麻烦。
那么,是否有什么方法可以让Laravel自动丢弃路径中的{sub}
变量呢?答案是,当然有,而且非常简单,那就是只需要在路由路径所用到的过滤器中声明将{sub}
变量遗忘即可
$request->route()->forgetParameter('sub');
这样之后,路由中的{sub}
变量就不会被传到控制器中了。