Lumen — изменение маршрута через промежуточное ПО

Итак, у меня есть промежуточное программное обеспечение API-версии, которое я использую в laravel 5, которое я пытаюсь использовать в lumen. Однако он использует getAction() и setAction() в промежуточном программном обеспечении, которое недоступно для lumen («пока»). Если я сделаю $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');
});

Может ли кто-нибудь сказать мне, как я могу обновить запрос с помощью моего простого обновления маршрута?


person Bill Garrison    schedule 24.11.2015    source источник
comment
Итак, вы хотите, чтобы один маршрут перенаправлялся на другой маршрут?   -  person Jerodev    schedule 24.11.2015
comment
Я добавил в свои маршруты для небольшого пояснения. Как видите, используется {api-namespace}(контроллер)@(действие). Промежуточное ПО копирует заголовок версии API и сравнивает его с отображением белого списка. Таким образом, вы получаете использование v1, v2 или v3\(controller)@(action). Это позволяет мне спокойно использовать версию моего API.   -  person Bill Garrison    schedule 24.11.2015
comment
Проблема в том, что промежуточное ПО, которое я использую для этого в Laravel 5, использует $route->getAction() и $route->setAction() для захвата/изменения/замены действия маршрута. Это недоступно в Lumen, поэтому я ищу альтернативы   -  person Bill Garrison    schedule 24.11.2015


Ответы (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 для всех моих маршрутов, я создал веб-папку под маршрутами и поместил туда файлы своей версии v0.php & v1.php

Итак, когда я делаю запрос, промежуточное ПО извлекает версию API и на основе номера версии включает соответствующую группу маршрутов. Это сохраняет версии чистыми и отдельными, но все же позволяет мне «творчески» работать с моими моделями.

Надеюсь это поможет. Мне пришлось применить это решение, потому что я не был уверен в использовании Dingo API в предварительной версии.

person Chukky Nze    schedule 06.07.2017