我可以在Laravel中的Route ::组中添加一个参数,但在调度到Laravel中的路由之前将其删除吗?

时间:2013-06-27 19:47:19

标签: php rest laravel laravel-4

我正在使用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

我有没有办法在我的所有路由中包含一个变量/参数,我可以在调度请求之前执行某些操作,而不会将其传递给函数?

2 个答案:

答案 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构造函数中检查帐户名称。您的路由前缀必须是已知值。