Php 我是否可以向Laravel中的Route::group添加一个参数,但在分派到Laravel中的路由之前将其删除?

Php 我是否可以向Laravel中的Route::group添加一个参数,但在分派到Laravel中的路由之前将其删除?,php,rest,laravel,laravel-4,Php,Rest,Laravel,Laravel 4,我正在使用Laravel 4创建API,这些API由我的每个客户的accountname命名。每个客户都有自己的、相同的数据库。所以Foocorp应该进行如下api调用: Barcorp api调用如下所示 由于业务/品牌原因,我必须在URL中包含帐户名,因此我无法从URL路由中删除此参数 下面是一个过滤器,我试图从路由中提取帐户名,验证它是否处于活动状态,并指向它们的数据库。我希望删除accountname参数,以便我可以编写所有控制器函数,使其不包含所有函数的$accountname参数

我正在使用Laravel 4创建API,这些API由我的每个客户的
accountname
命名。每个客户都有自己的、相同的数据库。所以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


是否有一种方法可以让我在所有路由中包含一个变量/参数,在发送请求之前可以使用该变量/参数,而该变量/参数不会传递给函数?

这不是使用过滤器的正确方法。事实上,如果您定义了一个过滤器“accountname”,那么这就是过滤器的名称——但您使用的是“accountverification”


您应该做的是,在UsersController构造函数中,检查帐户名。您的路由前缀必须是已知值。

可以。使用route函数:
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
参数,因此它不会作为参数包含在路由组中的每个控制器方法中

如果这个链接被破坏,请在以后留下评论,因为我会在必要时更新

编辑


在Laravel 5中,您也可以使用中间件来实现这一点,因为路由过滤器会贬值。

accountname与accountverification的对比是一个打字错误——感谢您捕捉到了这一点。我想我要说的是,我的每一个函数都需要限定到一个帐户。我想知道是否有一种方法可以全局处理这个问题,而不需要将我的每个函数都定义为包含$accountname参数。这个参数使数据库连接指向正确的数据库,但除此之外,它对业务逻辑没有影响,并且在每个控制器函数中基本上都是一个未使用的参数。我不确定它是否理想,但除了在构造函数中检查帐户名外,我还将在重写的callMethod函数中去掉第一个参数。这样,内部的各个函数就不需要定义$accountname参数。也许可以将您的逻辑放入
BaseController
的构造函数中?我有一个很好的解决方法,我有一个基本控制器,它在构造函数中注册beforeFilter,以拉出accountname参数并设置数据库。然后我重写callMethod,在调用父callMethod之前对$parameters数组执行数组_移位。