苗条(V3)框架:在生成的链接上添加前缀,但不在传入路由上添加前缀

时间:2019-06-28 22:15:41

标签: proxy routes slim prefix

除了Slim V3,我基本上有这个确切的问题Add a prefix to generated links, but not to incoming routes。这个问题的简短版本是:

  

如何为生成的链接添加前缀(例如,使用$ router-> pathFor('home')生成的链接),但不将此前缀作为路由的一部分。

在我的情况下,我有一个前端代理,它负责路由到Docker容器中的应用程序(尽管设置方式无关紧要)。

我需要最终发送回浏览器的链接以包含前缀,但是要使它们在路由中被忽略,因为代理服务器在通过时会删除它们。

谢谢。

1 个答案:

答案 0 :(得分:1)

Slim\Router似乎有一个basePath,可以通过调用setBasePath来设置,但是看来basePath在您的情况下没有用。您可以使用自定义的Router方法来拥有自己的pathFor类,该方法可以为命名路由生成的路径作为前缀,然后可以用Slim的默认router替换。这是一个功能齐全的示例:

// 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