使用Symfony2中的特定方案生成绝对URL

时间:2015-08-27 12:08:48

标签: php symfony

我想在Symfony2控制器中生成一个具有特定方案(https)的绝对URL。我找到的所有解决方案都指向configure the targeted route so that it requires that scheme。但我需要在http中保持可访问的路由,因此我无法将其设置为需要https(在这种情况下,http请求会重定向到相应的https URL)。

有没有办法生成一个URL,在该URL生成范围内只有一个特定的方案?

我看到使用'network'关键字生成一个"网络路径"风格的网址,看起来像" // example.com/dir/file" ;;也许我可以简单地做

'https:' . $this->generateUrl($routeName, $parameters, 'network')

但我不知道这对于任何路线或请求环境是否足够强大。

更新:经过URL生成代码调查后,这个"网络路径"解决方法似乎非常强大。网络路径与绝对URL完全相同,在" //"之前没有方案。

3 个答案:

答案 0 :(得分:5)

最好的方法

$url = 'https:'.$this->generateUrl($routeName, $parameters, UrlGeneratorInterface::NETWORK_PATH)

答案 1 :(得分:3)

根据代码或文档,目前您无法在generateUrl方法中执行此操作。所以你的“hackish”解决方案仍然是最好的,但正如@RaymondNijland评论你最好用str_replace

$url = str_replace('http:', 'https:', $this->generateUrl($routeName, $parameters));

如果您想确保只更换一个匹配项,您可以写:

$url = str_replace('http:', 'https:', $this->generateUrl($routeName, $parameters), 1);

如果你想确保它只在字符串的开头改变,你可以写:

$url = preg_replace('/^http:/', 'https:', $this->generateUrl($routeName, $parameters));

不,冒号(:)在正则表达式中没有特殊含义,所以你不必逃避它。

答案 2 :(得分:2)

默认为UrlGenerator,我认为不可能,如果你不想搞乱字符串。

您可以让自己的HttpsUrlGenerator extends UrlGenerator稍微改变一下:

在方法generate()中,而不是:

return $this->doGenerate(
    $compiledRoute->getVariables(), 
    $route->getDefaults(), 
    $route->getRequirements(), 
    $compiledRoute->getTokens(), 
    $parameters, 
    $name, 
    $referenceType, 
    $compiledRoute->getHostTokens(), 
    $route->getSchemes() 
);

你可以这样做:

return $this->doGenerate(
    $compiledRoute->getVariables(), 
    $route->getDefaults(), 
    $route->getRequirements(), 
    $compiledRoute->getTokens(), 
    $parameters, 
    $name, 
    $referenceType, 
    $compiledRoute->getHostTokens(), 
    ['https']
);

如您所见,$route->getSchemes()根据路线设置(您在上面提供的教程链接)中输入doGenerate()

您甚至可以进一步外化此架构阵列并通过__construct提供它。

希望这有点帮助;)