我可以在 Laravel 中向 Route::group 添加参数,但在调度到 Laravel 中的路由之前将其删除吗?
Posted
技术标签:
【中文标题】我可以在 Laravel 中向 Route::group 添加参数,但在调度到 Laravel 中的路由之前将其删除吗?【英文标题】:Can I add a parameter to a Route::group in Laravel but remove it before dispatching to a route in Laravel? 【发布时间】:2013-06-25 11:23:44 【问题描述】:我正在使用 Laravel 4 创建由每个客户的 accountname
命名的 API。每个客户都有自己的相同数据库。所以 Foocorp 应该进行如下所示的 api 调用:
http://api.example.com/Foocorp/users/5
Barcorp api 调用如下所示
http://api.example.com/Barcorp/users/5
出于业务/品牌原因,我必须在 URL 中包含帐户名称,因此我无法从 URL 路由中删除此参数。
这是我用来尝试从路由中提取帐户名称的过滤器,验证它是否处于活动状态,并指向他们的数据库。我希望删除accountname
参数,这样我就可以编写我所有的控制器函数,使其不包含所有的$accountname
参数。
Route::filter('accountverification', function()
$route = Route::getCurrentRoute();
$params = $route->getParameters();
$accountName = $params['accountname'];
// verify account with this name exists and set up DB connection to point to their database
// ...
unset($params['accountname']);
$route->setParameters($params);
);
这是我使用过滤器的路由组:
Route::group(array('prefix' => 'accountname', 'before' => 'accountverification'), function()
Route::get('users/id', 'UsersController@getShow')
->where(array('id' => '[0-9]+'));
);
问题是在调用控制器/函数时删除过滤器中的参数没有任何效果。在 UsersController::getShow 函数中,第一个参数始终是组前缀中的 accountname
。
有没有办法让我在所有路由中包含一个变量/参数,我可以在分派请求之前对其执行某些操作,但不会将其传递给函数?
【问题讨论】:
我有一个 hacky 解决方法,我有一个基本控制器,它在其构造函数中注册一个 beforeFilter 以提取 accountname 参数并设置数据库。然后我在调用父 callMethod 之前覆盖 callMethod 以在 $parameters 数组上执行 array_shift。 【参考方案1】:这不是使用过滤器的正确方法。事实上,如果您定义了一个过滤器“accountname”,那么这就是过滤器的名称 - 但您使用的是“accountverification”。
您应该做的是,在您的 UsersController 构造函数中,检查帐户名称。您的路由前缀必须是已知值。
【讨论】:
“accountname”与“accountverification”是一个错字——感谢您发现这一点。我想我要说的是我的每一个功能都需要限定在一个帐户中。我想知道是否有一种方法可以全局处理此问题,而无需将我的每个函数都定义为包含 $accountname 参数。此参数使数据库连接指向正确的数据库,但除此之外,它对业务逻辑没有影响,并且本质上是每个控制器函数中未使用的参数。 我想我听懂了你的意思。我不确定它是否理想,但除了检查构造函数中的帐户名称之外,我还取消了覆盖的 callMethod 函数中的第一个参数。这样内部的各个函数就不需要定义 $accountname 参数了。 或许把你的逻辑放到BaseController
的构造函数中?【参考方案2】:
是的,你可以。使用路由函数:forgetParameter($parameter)
删除参数,使其不包含在控制器的参数中。此功能在 laravel 4.1 或更高版本中可用。以您为例:
Route::filter('accountverification', function(Route $route)
$params = $route->getParameters();
$accountName = $params['accountname'];
// verify account with this name exists and set up DB connection to point to their database
// ...
$route->forgetParameter('accountname');
);
例如,我使用它来忘记路由中的 locale
参数,因此它不会作为参数包含在路由组内的每个控制器方法中。
http://laravel.com/api/4.2/Illuminate/Routing/Route.html#method_forgetParameter
如果此链接损坏,请在以后发表评论,因为我会在必要时更新。
编辑:
在 Laravel 5 中,您也可以使用中间件来执行此操作,因为路由过滤器已被弃用。
【讨论】:
以上是关于我可以在 Laravel 中向 Route::group 添加参数,但在调度到 Laravel 中的路由之前将其删除吗?的主要内容,如果未能解决你的问题,请参考以下文章
在 Laravel 中向 API 资源链接添加参数 [重复]
如何在 Laravel 5.6 中向资源控制器添加自定义方法
如何在 Laravel-8 和 InertiaJs 中向服务器发出 POST 请求时在浏览器中保留当前的 GET url