我正在使用Laravel 4创建由我的每个客户的accountname
命名的API。每个客户都有自己的相同数据库。所以Foocorp应该做出如下所示的api调用:
Barcorp api调用看起来像这样
出于业务/品牌推广的原因,我必须在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
。
我有没有办法在我的所有路由中包含一个变量/参数,我可以在调度请求之前执行某些操作,而不会将其传递给函数?
答案 0 :(得分:4)
是的,你可以。使用路由功能: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中,您可以使用中间件来执行此操作,因为路由过滤器已弃用。
答案 1 :(得分:0)
这不是使用过滤器的正确方法。实际上,如果您定义过滤器“accountname”,那么这就是过滤器的名称 - 但您使用的是“accountverification”。
您应该在UsersController构造函数中检查帐户名称。您的路由前缀必须是已知值。