Slim (V3) Framework: добавьте префикс к сгенерированным ссылкам, но не к входящим маршрутам - PullRequest
0 голосов
/ 29 июня 2019

У меня точно такой же вопрос Добавить префикс к сгенерированным ссылкам, но не к входящим маршрутам , а для Slim V3. Краткая версия вопроса:

Как добавить префикс к сгенерированным ссылкам (например, сгенерированным с помощью $ router-> pathFor ('home'), например), но НЕ включать этот префикс как часть маршрутизации.

В моей ситуации у меня есть внешний прокси-сервер, который отвечает за маршрутизацию к моему приложению в контейнере Docker (хотя, как это настроить, не имеет значения).

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

Заранее спасибо.

1 Ответ

1 голос
/ 29 июня 2019

Класс Slim\Router, кажется, имеет basePath, который можно установить, вызвав setBasePath, но кажется, что этот basePath не полезен в вашем случае.У вас может быть свой собственный класс Router с пользовательским методом pathFor, способным префиксировать ваши пути, сгенерированные для именованного маршрута, затем вы можете заменить стандартный router Slim на ваш.Вот полностью функциональный пример:

// declare your class and change pathFor behavior
class MyPrefixAwareRouter extends Slim\Router {
    private $prefix = '';
    public function setPrefix($prefix = '') {
        $this->prefix = $prefix;
    }
    public function pathFor($name, array $data = [], array $queryParams = [])
    {
        return $this->prefix . parent::pathFor($name, $data, $queryParams);
    }
}

$container = new Slim\Container;

// custom path prefix for all named routes
$container['route-prefix'] = '/some/prefix/to/be/removed/by/proxy';

// router setup, copied from Slim\DefaultServicesProvider.php
// with slight change to call setPrefix
$container['router'] = function ($container) {
    $routerCacheFile = false;
    if (isset($container->get('settings')['routerCacheFile'])) {
        $routerCacheFile = $container->get('settings')['routerCacheFile'];
    }
    $router = (new MyPrefixAwareRouter)->setCacheFile($routerCacheFile);
    if (method_exists($router, 'setContainer')) {
        $router->setContainer($container);
    }
    $router->setPrefix($container->get('route-prefix'));

    return $router;
};
$app = new \Slim\App($container);

$app->get('/sample', function($request, $response, $args){
    return "From request: " . $request->getUri()->getPath() . "\nGenerated by pathFor: " . $this->router->pathFor('sample-route');
})->setName('sample-route');
// Run app
$app->run();

Если вы посетите <your-domain>/sample, результат будет:

From request: /sample
Generated by pathFor: /some/prefix/to/be/removed/by/proxy/sample
...