通过查询参数过滤路由的更好方法


Better way to filter a route by query parameter?

在Laravel 4.2项目中,我有以下路线:

Route::group(['prefix' => 'api/v' . Config::get('api.version')], function () {
    if (Input::get('api_key') != Config::get('api.key')) {
        App::abort(401, 'Invalid API key!');
    }
    // Do stuff below...
});

通过以下方式访问:

http://domain.com/api/v1/do-stuff/value1/value2?api_key=2fl2bkqg2yqlf2l872qa

这对于用户使用他们的密钥访问API非常有用。但是,当我运行php artisan migrate --seed时,它会触发api_key限制。

有没有更好的方法来限制我的路由组由API键在Laravel,不会导致这个问题的迁移?

创建路由组后,即使组内没有路由被触发,也会立即运行API检查。您可以将逻辑添加到离开组的过滤器中,只保留路由,以避免这种情况,并仅在路由被过滤时执行api检查。

Route::filter("api", function()
{
    if (Input::get('api_key') != Config::get('api.key')) 
    {
        return App::abort(401, 'Invalid API key!');
    }
});

然后在你的路由组中删除内联代码并添加过滤器

Route::group(array('prefix' => 'api/v1', 'before' => 'api'), function()
{
    // Routes here
});

因为这些是过滤器,所以它们对于单元测试是禁用的。因为过滤器只在该组中执行路由时才会运行,所以当创建路由组时,artisan命令不会触发api检查。