流明 - 通过中间件

时间:2015-11-24 15:50:22

标签: php laravel lumen

所以我有一个api-version中间件,我在laravel 5中使用,我试图在流明中使用。但是,它在中间件中使用getAction()setAction(),这对于流明来说是不可用的("然而")。如果我$request->route()[1]我可以获得当前路线,但使用新路线更新它并不好。我已经考虑过克隆请求并修改它但我无法告诉我需要的请求对象的哪一部分"更新"。

以下是我的路线:

$app->group(['middleware' => ['api-version']], function() use ($app) {
    $app->get('users', '{api-namespace}\UsersController@index');
    $app->get('vips/{per_page?}', '{api-namespace}\VipsController@index');
    $app->get('vip/{id}/profile', '{api-namespace}\VipsController@showProfile');
    $app->get('vip/{id}', '{api-namespace}\VipsController@show');
});

有人能告诉我如何通过简单的路线更新来更新请求吗?

1 个答案:

答案 0 :(得分:1)

在我寻找解决方案时找到了这个。这就是我在Lumen 5.4中使用中间件时想到的。

首先,我创建了一个ExtractApiVersionMiddleware,它从Accept标头中提取版本。我使用了accept标头,因为并非所有传递的标头都是可信的,并且它正在成为"最佳实践":以这种方式传递API版本:

<?php

namespace App\Http\Middleware;

use Closure;

class ExtractApiVersionMiddleware
{
/**
 * Handle an incoming request.
 *
 * @param  \Illuminate\Http\Request $request
 * @param  \Closure $next
 *
 * @return mixed
 */
public function handle($request, Closure $next)
{
    $app = app();
    $version = "0";
    foreach (explode(';', $request->header('accept')) as $frag) {
        if (stristr($frag, "version=")) {
            $version = str_replace("version=", "", $frag);
            break;
        }
    }

    if ($version != 0) {
        $app->group(['namespace' => "App\Http\Controllers\V{$version}\Reductions"],
            function () use ($app, $version) {
            require base_path() . "/routes/web/v{$version}.php";
        });
    } else {
        $app->group(['namespace' => 'App\Http\Controllers\V0'], function () use ($app, $version) {
            require base_path() . "/routes/web/v0.php";
        });
    }

    return $next($request);
}
}

其次,我根据版本命名我的代码(遗留的代码库还没有死掉)。

第三,我传递了调用在Accept标头中使用的版本 Accept: application/json;version=1

第四,我为每个支持的版本都有单独的路径文件。因此,我没有为所有路线创建web.php,而是在路线下创建了一个Web文件夹,并将我的版本文件放在那里v0.php & v1.php

因此,当我提出请求时,中间件会提取API版本,并根据版本号启用相应的路由组。这使版本保持清洁和分离,但仍然使我能够获得创造性的#39;与我的模特。

希望这会有所帮助。我必须应用此解决方案,因为我不确定在预发布表单中使用Dingo API