我可以在 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 5.4 中向多个抄送收件人发送电子邮件

如何在 laravel 中向手动注册事件监听器添加测试?

在 Laravel 中向 API 资源链接添加参数 [重复]

如何在 Laravel 5.6 中向资源控制器添加自定义方法

表单提交后,在 laravel 中向用户显示提交的数据

如何在 Laravel-8 和 InertiaJs 中向服务器发出 POST 请求时在浏览器中保留当前的 ​​GET url