访问config.yml中的当前子域

时间:2014-12-14 13:28:09

标签: php symfony doctrine-orm doctrine

我有一个简单的Symfony2应用程序,需要根据子域连接到特定的数据库。数据库名称与子域名相同。

域:alpha.example.com - 数据库名称:alpha

域:beta.example.com - 数据库名称:beta

我想到的最简单的方法是将当前子域传递到config.yml文件

#config.yml
doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        port:     "%database_port%"
        dbname:   "current-subdomain-name-here"
        user:     "%database_user%"
        password: "%database_password%"

问题是如何通过&访问config.yml中的当前子域名?

4 个答案:

答案 0 :(得分:1)

我认为这是不可能的,但无论如何配置文件都不应该包含任何应用程序逻辑。

您可以按照食谱中关于multiple managers and connections的说明进行操作,然后创建逻辑(例如使用依赖注入服务),但实现取决于您不知道的具体用例什么都没有。

答案 1 :(得分:1)

我避免将其放入app.php。也许您在app_dev.php中也需要相同的代码进行开发和测试。

每个子域一个配置文件看起来也不太方便。

看看:

http://symfony.com/doc/current/cookbook/configuration/external_parameters.html#miscellaneous-configuration

你可以做一些像(未经测试)的事情:

# app/config/config.yml
imports:
    - { resource: parameters.php }

-

// app/config/parameters.php
$subdomain = array_shift((explode(".",$_SERVER['HTTP_HOST'])));
$container->setParameter('doctrine.dbal.dbname', $subdomain);

答案 2 :(得分:0)

您不希望在config.yml中执行此操作。相反,您应该挂钩内核请求并在那里设置您的连接。看看这篇文章的接受答案:

Symfony2, Dynamic DB Connection/Early override of Doctrine Service

然后,您可以在侦听器中使用$this->request->getHost(),解析子域,并在将子域名称作为dbname参数传递后打开与数据库的连接。例如(未测试):

public function onKernelRequest()
{
    // this might cause issues if there is no subdomain, might need regex...just an example
    $dbname = array_shift(explode('.', $this->request->getHost()));
    $params = $this->connection->getParams();

    if ($dbname !== $params['dbname'])
    {
        $this->connection->close();

        $this->connection = new Connection()
            $params,
            $this->connection->getDriver(),
            $this->connection->getConfiguration(),
            $this->connection->getEventManager()
        );

        try {
            $this->connection->connect();
        } catch (Exception $e) {
            // log and handle exception
        }
    }
}

答案 3 :(得分:0)

我已经通过以下方式解决了自己的挑战。

我为每个子域创建了不同的配置文件。就我而言,我的子域名数量有限。

#config.yml
doctrine:
    dbal:
        driver:   "%database_driver%"
        host:     "%database_host%"
        port:     "%database_port%"
        user:     "%database_user%"
        password: "%database_password%"

子域alpha.example.com的配置:

#config_alpha.yml
doctrine:
    dbal:
        dbname:   "alpha"

子域beta.example.com的配置:

#config_beta.yml
doctrine:
    dbal:
        dbname:   "beta"

app.php我们确定子域名,并加载相应的配置:

// web/app.php
// ...
$subdomain = array_shift((explode(".",$_SERVER['HTTP_HOST'])));
// In case of alpha.example.com
// $subdomain = "alpha"
// Its going to load config_alpha.yml
$kernel = new AppKernel($subdomain, true);
// ...