Php SAAS模式下的Symfony 1.4项目-多个数据库
我有一个Symfony 1.4项目,我想在SAAS模式下为多个客户使用。 其思想是拥有多个域和数据库,但始终使用相同的代码。我也不想为每个新客户改变项目中的任何内容:一切都必须是动态的 我已经尝试了几个小时来覆盖database.yml配置,但没有成功。我在ProjectConfiguration.class.php的开头添加了: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';
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']已相应填充?那么,在尝试连接到所需数据库时是否会引发任何异常?