使用多个域

时间:2016-01-02 16:18:58

标签: symfony

我有一个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。

1 个答案:

答案 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';
    }
}