Предварительная обработка параметров маршрута просвета с помощью urldecode - PullRequest
0 голосов
/ 24 октября 2018

В настоящее время я использую инфраструктуру lumen (5.6) для создания API, этот API можно использовать для запроса страницы, например, по ее названию.Маршрут для этого:

Route::group(["prefix" => '/api/v1', "middleware" => ["ContentTypeJson","Paginator"]], function () {


    Route::group(["prefix" => '/{databaseIdentifier}', "middleware"=>"DatabaseIdentifier"], function () {

        Route::group(["prefix" => '/pages'], function () {

            Route::group(["prefix" => '/{title}'], function () {

                Route::get("/", "PageController@getPageByTitle");

                Route::get("/parents", "SearchController@getParentalSpecies");

                Route::get("/all", "PageController@getPageByTitleWithLinks");

                Route::get("/overlap/{overlapProperty}", "PageController@getPagesWithOverlap");

                Route::put("/", "PageController@overwritePage");

            });

        });
});

Как вы можете видеть, title используется в нескольких функциях и контроллерах, то же самое относится к databaseIdentifier, который используется в промежуточном программном обеспечении для определения потребностей базы данных.для использования.

Однако все параметры URL с пробелом будут преобразованы с %20 вместо пробела, что является ожидаемым поведением.Однако я хотел бы преобразовать это обратно в необработанную строку, что можно сделать с помощью urldecode().Но так как это применяется в каждом контроллере и функции, я хотел бы использовать для этого какой-то шаг предварительной обработки.

Я попытался использовать промежуточное программное обеспечение для этого, чтобы изменить параметры маршрута, как предложено здесь (используя $request->route()->setParameter('key', $value);).

К сожалению, это не работает в люменах, поскольку результатом $request->route() является массив, а не объект.Я попытался изменить этот массив, но не могу заставить его изменить фактический массив в объекте Request.Здесь не появляется никаких ошибок.

Итак, вкратце: я ищу способ urldecode каждого параметра URL, который передается моим контроллерам и функциям, не помещая $param = urldecode($param); везде.

Если вам нужна дополнительная информация, не стесняйтесь спрашивать
Заранее спасибо

1 Ответ

0 голосов
/ 24 октября 2018

Для тех, кто также сталкивается с этой проблемой, я нашел решение с использованием промежуточного программного обеспечения.

В промежуточном программном обеспечении я делаю следующее:

public function handle(Request $request, Closure $next)
    {
        $routeParameters = $request->route(null)[2];

        foreach ($routeParameters as $key=>$routeParameter) {
            $routeParameters[$key] = urldecode($routeParameter);
        }

        $routeArray = $request->route();
        $routeArray[2] = $routeParameters;
        $request->setRouteResolver(function() use ($routeArray)
        {
            return $routeArray;
        });

        return $next($request);
    }

Этот код будет декодировать каждый параметр маршрута и сохранять его в массиве, затем я беру весь массив маршрутов, который создается самим люменом(который содержит параметры, закодированные по URL), затем они заменяются версией параметра, декодированной по URL.Этого недостаточно, поскольку это не влияет на массив маршрутов в объекте Request.

Чтобы применить эти изменения, я изменяю routeResolver, поэтому он будет возвращать измененный массив вместо того, который был созданпросвет.

...