Php 访问config.yml中的当前子域

Php 访问config.yml中的当前子域,php,symfony,doctrine-orm,doctrine,Php,Symfony,Doctrine Orm,Doctrine,我有一个简单的Symfony2应用程序,需要连接到基于子域的特定数据库。数据库名称与子域名相同 域:alpha.example.com-DB name:alpha 域名:beta.example.com-DB name:beta 我认为,实现这一点最简单的方法是将当前子域传递到config.yml文件中 #config.yml doctrine: dbal: driver: "%database_driver%" host: "%databas

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

域:
alpha.example.com
-DB name:
alpha

域名:
beta.example.com
-DB name:
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
中传递和访问当前子域名?

我认为这是不可能的,但在任何情况下,配置文件都不应该包含任何应用程序逻辑


您可以按照cookbook中解释的指令进行操作,然后创建逻辑(例如使用依赖注入服务),但实现取决于您的特定用例,我对此一无所知。

您不希望在config.yml中执行此操作。相反,您应该钩住内核请求并在那里设置连接。查看此帖子的公认答案:

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


我用以下方法解决了我自己的挑战

我为每个子域创建了不同的配置文件。在我的例子中,我的子域数量有限

#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"
#config_beta.yml
doctrine:
    dbal:
        dbname:   "beta"
子域
beta.example.com
的配置:

#config_alpha.yml
doctrine:
    dbal:
        dbname:   "alpha"
#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);
// ...

我不想把它放到
app.php
中。也许您在
app_dev.php
中也需要相同的代码来进行开发和测试

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

看看:

在那里,您可以执行以下操作(未测试):

-


哇,我不知道。非常有用。这对我也很有用。
// app/config/parameters.php
$subdomain = array_shift((explode(".",$_SERVER['HTTP_HOST'])));
$container->setParameter('doctrine.dbal.dbname', $subdomain);