簡體   English   中英

Slim (V3) 框架:為生成的鏈接添加前綴,但不為傳入路由添加前綴

[英]Slim (V3) Framework: Add a prefix to generated links, but not to incoming routes

我基本上有這個確切的問題為生成的鏈接添加前綴,但不是添加到傳入路由,而是用於 Slim V3。 問題的簡短版本是:

如何為生成的鏈接添加前綴(例如,使用 $router->pathFor('home') 生成的鏈接)但不將此前綴作為路由的一部分包含在內。

在我的情況下,我有一個前端代理,它負責路由到 Docker 容器中的應用程序(盡管它的設置方式無關緊要)。

我需要最終發送回瀏覽器的鏈接以包含前綴,但它們在路由中被忽略,因為代理服務器在執行傳遞時刪除它們。

Class Slim\\Router似乎有一個basePath可以通過調用setBasePath來設置,但似乎這個 basePath 在你的情況下沒有用。 您可以使用自定義pathFor方法擁有自己的Router類,該方法能夠為為命名路由生成的路徑添加前綴,然后您可以將 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM