Php 在Symfony2中生成具有特定方案的绝对URL

Php 在Symfony2中生成具有特定方案的绝对URL,php,symfony,Php,Symfony,我想在Symfony2控制器中生成带有特定方案(https)的绝对URL。我找到的所有解决方案都指向我。但是我需要路由在http中保持可访问性,所以我不能将其设置为需要https(在这种情况下,http请求被重定向到相应的https URL) 是否有方法仅在URL生成的范围内使用特定方案生成URL 我看到使用'network'关键字生成了一个“networkpath”样式的URL,看起来像“//example.com/dir/file”;所以也许我可以简单地做到 'https:' . $this

我想在Symfony2控制器中生成带有特定方案(https)的绝对URL。我找到的所有解决方案都指向我。但是我需要路由在http中保持可访问性,所以我不能将其设置为需要https(在这种情况下,http请求被重定向到相应的https URL)

是否有方法仅在URL生成的范围内使用特定方案生成URL

我看到使用
'network'
关键字生成了一个“networkpath”样式的URL,看起来像“//example.com/dir/file”;所以也许我可以简单地做到

'https:' . $this->generateUrl($routeName, $parameters, 'network')
但我不知道这对于任何路由或请求上下文是否足够健壮


更新:在对URL生成代码进行调查之后,这个“网络路径”解决方案看起来非常健壮。网络路径完全按照绝对URL生成,在“//”

和默认的
UrlGenerator
之前没有一个方案,我认为这是不可能的,如果你不想弄乱字符串的话

您可以自己制作
HttpsUrlGenerator扩展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()

您甚至可以更进一步,将这个模式数组外部化,并通过
\uu-construct
提供它


希望这有点帮助;)

根据代码或文档,目前无法在generateUrl方法中执行此操作。因此,您的“黑客”解决方案仍然是最好的,但正如@RaymondNijland评论的那样,您最好使用
str\u replace

$url = str_replace('http:', 'https:', $this->generateUrl($routeName, $parameters));
如果要确保仅在字符串开头更改,可以编写:

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

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

最好的方法是这样做

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

看起来这是一个强大的解决方案。Symfony可以根据您的路由配置生成Url。您还可以生成一个绝对Url,并将http:替换为https:这样您就不会从您的网络中删除www子域domain@RaymondNijland,从简单的测试来看,它似乎是一个子域(如www)正确包含在生成的“网络路径”URL中。尽管如此,我仍然不知道这些URL是否总是与对应的绝对URL相同,只是没有
/
之前的方案,或者是否可能存在结果不同的特定场景…如果OP决定采用基于字符串操作的解决方案,这确实是一种很好的方法:)是的,如果我们使用字符串操作,正则表达式版本似乎是最好的。“仅出现一次”可能会被以下事实所愚弄:在某些上下文中,生成的URL可能已经是https格式,在这种情况下,字符串替换可能会进一步弄乱URL中的其他内容。答案是可以接受的,但对我来说,应该避免使用非正则表达式版本,因为它们可能会弄乱URL的其余部分。最后,对我来说,要么是“网络路径”解决方案(更干净),要么是正则表达式字符串操作(在阅读代码时更容易理解,因为它使用了更常见的机制)。我同意
preg\u replace
解决方案听起来最适合这项工作。希望这个答案对其他人也有用。仅供参考:你不能限制str_replace的频率。第四个参数用于传递count变量的引用。谢谢,但据我所知,该解决方案将导致所有绝对URL都以https生成,这是不需要的。我可以进一步修改
HttpsUrlGenerator
以添加另一个参数来应用或不应用特定的方案,但似乎我还必须扩展堆栈的其余部分(
Router
Controller
)。有点乏味。不过,这应该行得通。是的,这是真的。虽然,我认为您实际上只想生成
https
url。。。我的错误。。。