我有一个Symfony项目,它为两个不同的国家/地区使用两个不同的域。该站点是客户端登录界面,除了品牌和次要名称差异外,两个域的基本相同。那部分没关系。
这两个域在我的参数中定义为us_domain和ca_domain,在我的routing.yml中我有:
clients:
resource: @ClientsBundle/Resources/config/routing.yml
host: "clients.{domain}"
prefix: /
requirements:
domain: %us_domain%|%ca_domain%
defaults: { domain: "%us_domain%" }
在Twig,我的菜单使用:
<li><a href="{{ path("clients_order_index") }}" class="active"><span>Home</span></a></li>
问题在于,虽然页面会出现在任一域上,但生成的路径始终使用us_domain,显然是从路由中的默认值中拉出来的。 (我可以将其切换到ca_domain并且路径会切换)。
我的问题是,为什么当前的域名未被检测和使用?看起来默认应该被实际使用的域覆盖?
如果重要的话,我正在运行Nginx。
答案 0 :(得分:0)
我不知道错过了路由变量不会被自动检测到,但你必须将它们作为通话的一部分传递。我最终用自定义的Twig过滤器解决了这个问题。
在我使用路径的地方,我从app.request.host传递了域变量,例如
<li><a href="{{ path("clients_default_index", { domain: domainFromHost(app.request.host) }) }}" class="active"><span>Home</span></a></li>
然后只写了Twig扩展,解析/评估了主机并传回了域
<?php
namespace AppBundle\Twig;
use JMS\DiExtraBundle\Annotation as DI;
/**
* Class TwigUrlExtension
* @DI\Service("twig.extension.url")
* @DI\Tag("twig.extension")
*
*/
class TwigUrlExtension extends \Twig_Extension
{
protected $ca_domain;
protected $us_domain;
/**
*
* @DI\InjectParams({
* "us_domain" = @DI\Inject("%us_domain%"),
* "ca_domain" = @DI\Inject("%ca_domain%")
* })
* @param $us_domain
* @param $ca_domain
*/
public function __construct($us_domain, $ca_domain)
{
$this->us_domain = $us_domain;
$this->ca_domain = $ca_domain;
}
/**
* {@inheritdoc}
*/
public function getFunctions() {
return array(
'domainFromHost' => new \Twig_Function_Method($this, 'toDomain')
);
}
/**
* @param string $string
* @return int
*/
public function toDomain ($string) {
if(stripos($string,$this->ca_domain) !== false)
return $this->ca_domain;
if(stripos($string,$this->us_domain) !== false)
return $this->us_domain;
return $string;
}
/**
* {@inheritdoc}
*/
public function getName() {
return 'twig_url_extension';
}
}