Slim (V3) 框架:为生成的链接添加前缀,但不为传入路由添加前缀

Posted

技术标签:

【中文标题】Slim (V3) 框架:为生成的链接添加前缀,但不为传入路由添加前缀【英文标题】:Slim (V3) Framework: Add a prefix to generated links, but not to incoming routes 【发布时间】:2019-06-28 22:15:41 【问题描述】:

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

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

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

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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Slim (V3) 框架:为生成的链接添加前缀,但不为传入路由添加前缀的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Slim框架支持API版本控制

SLIM框架路由验证v2与v3

text 将Twig扩展添加到Slim Framework V3

学习Slim Framework for PHP v3

学习Slim Framework for PHP v3 ( 二)

JWT:slim v3 和 Android 中的身份验证