Laravel中,如何将路由Route中的变量丢弃不传给控制器Controller?

星级:
Laravel中,路由Route中的自定义变量(如,var_name)可以通过在过滤器中声明【$request->route()->forgetParameter('var_name');】丢弃,被丢弃的变量var_name 将会被Laravel自动忽视,不会被传到控制器Controller中。

在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}变量就不会被传到控制器中了。