我正在开发一个小型CakePHP应用程序,该应用程序受到以下约束(笨拙但不受我的控制):我需要它在两个相同的数据库中的任何一个上工作,选择基于URL。例如:
http://www.example.com/myapp/foo/action/param
http://www.example.com/myapp/bar/action/param
第一个明显的解决方案是在myapp/foo
和myapp/bar
具有两个相同的CakePHP应用程序,具有不同的数据库配置。不过,这有一种愚蠢的感觉,所以我试图找到一种创建单个应用程序的优雅方式。
我正在考虑的方法是:定义路由,使myapp/foo
和myapp/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;
}
}
(当然我已经为这两个数据库定义了fooConfig
和barConfig
。)我确实可以控制URL,所以我可以确信不会发生任何无关的事件。 URL中的foo
或bar
。
我的问题是:是否有更简单,更优雅的方式处理这种奇怪的情况?也许是AppModel
和/或AppController
中的某些内容?虽然我已经摆脱了重复的代码,但我无法摆脱我用另一种代码替换一种代码味道的感觉。
答案 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”:)但它不会破坏您的应用。