CakePHP - 根据路由或网址选择数据库配置?

时间:2011-08-01 20:48:33

标签: cakephp

我正在开发一个小型CakePHP应用程序,该应用程序受到以下约束(笨拙但不受我的控制):我需要它在两个相同的数据库中的任何一个上工作,选择基于URL。例如:

http://www.example.com/myapp/foo/action/param
http://www.example.com/myapp/bar/action/param

第一个明显的解决方案是在myapp/foomyapp/bar具有两个相同的CakePHP应用程序,具有不同的数据库配置。不过,这有一种愚蠢的感觉,所以我试图找到一种创建单个应用程序的优雅方式。

我正在考虑的方法是:定义路由,使myapp/foomyapp/bar与同一个控制器相关联。然后给我的DATABASE_CONFIG类一个构造函数:

function __construct() {
  $pathParts = explode('/', $_SERVER['REQUEST_URI']);
  if (array_search('foo', $pathParts)) {
    $this->default = $this->fooConfig;
  } else if (array_search('bar', $pathParts)) {
    $this->default = $this->barConfig;
  }
}

(当然我已经为这两个数据库定义了fooConfigbarConfig。)我确实可以控制URL,所以我可以确信不会发生任何无关的事件。 URL中的foobar

我的问题是:是否有更简单,更优雅的方式处理这种奇怪的情况?也许是AppModel和/或AppController中的某些内容?虽然我已经摆脱了重复的代码,但我无法摆脱我用另一种代码替换一种代码味道的感觉。

2 个答案:

答案 0 :(得分:1)

有几种方法可以做到这一点,这里有一个。

写一个总是匹配的甜蜜自定义路线:

Router::connect('/:ds/*', array(), array('routeClass' => 'SweetDbRoute'));

然后让SweetDbRoutes设置一个可以在任何地方使用的类变量,包括在模型构造函数中。然后它应该失败,所以你实际上没有调整请求。

App::import('SweetDbClass', array('file' => '/path/to/your/sweet_db_class.php'));
class SweetDbRoute extends CakeRoute {
    // put your failing route code here, but use your SweetDbClass to track datasource ...
    // see http://book.cakephp.org/view/1634/Custom-Route-classes
}

然后在您的AppModel中:

App::import('SweetDbClass', array('file' => '/path/to/your/sweet_db_class.php'));
    class AppModel extends Model {
    public function __construct($id = false, $table = null, $ds = null) {
        $ds = SweetDbClass::$ds;
        parent::__construct($id, $table, $ds);
    }
}

答案 1 :(得分:0)

例如,在一个数据库中执行插入后,两者不会“相同”,对吧?这两个数据库是否以某种方式相互同步?我不知道你需要在这些数据库上做什么,但是做两个独立的应用程序可能更容易。

是的,你可以在模型中指定数据库配置:http://book.cakephp.org/view/922/Database-Configuration但是你不能动态地改变它(我想这些模型不会改变与另一个表的关联)。你做的可能是唯一的方法。

  

我确实可以控制网址,因此我可以确信网址中不会出现多余的foo或bar

是的,网址中可能存在“无关的foo或bar”:)但它不会破坏您的应用。