Php SAAS模式下的Symfony 1.4项目-多个数据库

Php SAAS模式下的Symfony 1.4项目-多个数据库,php,doctrine,symfony1,symfony-1.4,doctrine-1.2,Php,Doctrine,Symfony1,Symfony 1.4,Doctrine 1.2,我有一个Symfony 1.4项目,我想在SAAS模式下为多个客户使用。 其思想是拥有多个域和数据库,但始终使用相同的代码。我也不想为每个新客户改变项目中的任何内容:一切都必须是动态的 我已经尝试了几个小时来覆盖database.yml配置,但没有成功。我在ProjectConfiguration.class.php的开头添加了: require_once '/path/to/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine.php';

我有一个Symfony 1.4项目,我想在SAAS模式下为多个客户使用。 其思想是拥有多个域和数据库,但始终使用相同的代码。我也不想为每个新客户改变项目中的任何内容:一切都必须是动态的

我已经尝试了几个小时来覆盖database.yml配置,但没有成功。我在ProjectConfiguration.class.php的开头添加了:

require_once '/path/to/plugins/sfDoctrinePlugin/lib/vendor/doctrine/Doctrine.php';
spl_autoload_register(array('Doctrine', 'autoload'));
$manager = Doctrine_Manager::getInstance();

$serverName = $_SERVER['SERVER_NAME'];
if(preg_match("#\.saas-domain\.com$#", $serverName))
  $dbname = "db-" . preg_replace("#\.saas-domain\.com$#", "", $serverName);
else
  $dbname = "db-default";

$dsn      = "mysql:dbname=$dbname;host=localhost";
$user     = 'dbuser';
$password = 'dbpsw';

try {
  $dbh  = new PDO($dsn, $user, $password);
  $conn = Doctrine_Manager::connection($dbh);
} catch (PDOException $e) {
  die("Can't find that database");
}
我试着把这段代码放在
setup()
方法的末尾,同样的事情:它似乎没有被使用

如您所见,我想从域(apache中的服务器名)推断要使用的数据库

我的最后一个选择是手动更改缓存中生成的每个
config\u database.yml.php
文件(实际上只更改一个并使用符号链接),但我真的不想这样做

因此,我的问题是:

  • 是否可以覆盖database.yml配置
  • 如果没有,是否有办法删除此文件或忽略它并设置手动条令配置
  • 有没有其他我没有考虑过的解决方案?

编辑

我(在他的帮助下)设法想出了一个解决办法。这可能不是最好的方法,但至少结果还可以。 其想法是使用Symfony的过滤器来替换数据库YAML文件创建的连接:

config/filters.yml
中添加以下内容:

myDBConnectionFilter:
  class: myDBConnectionFilter
然后创建这个
myDBConnectionFilter
类,并将其放在Symfony的autoloader可以找到的任何地方(
lib
)。下面是可以在此类中使用的代码示例:

<?php

class myDBConnectionFilter extends sfFilter
{
    public function execute($filterChain){
        if ($this->isFirstCall())
        {
            $serverName = $_SERVER['SERVER_NAME'];
            if(preg_match("#\.saas-domain\.com$#", $serverName))
              $dbname = "db-" . preg_replace("#\.saas-domain\.com$#", "", $serverName);
            else
              $dbname = "db-default";

            $dsn      = "mysql:dbname=$dbname;host=localhost";
            $user     = 'user';
            $password = 'password';

            $manager = Doctrine_Manager::getInstance();

            try {
              $default = $manager->getConnection('dbconnection');
              Doctrine_Manager::getInstance()->closeConnection($default);

              $dbh  = new PDO($dsn, $user, $password);
              $conn = Doctrine_Manager::connection($dbh, 'dbconnection');
            } catch (Exception $e) {
                die("Error : " . $e->getMessage());
            }
        }

        $filterChain->execute();
    }
}

也许您可以编写一个安装脚本,猜测数据库名称并将其写入
databases.yml
文件中。您是否检查过,给定您所属的子域,$\u SERVER['SERVER\u name']已相应填充?那么,在尝试连接到所需数据库时是否会引发任何异常?