CakePHP - выбрать конфигурацию базы данных на основе маршрута или URL? - PullRequest
1 голос
/ 02 августа 2011

Я работаю над небольшим приложением CakePHP, на которое наложено следующее ограничение (неудобно, но вне моего контроля): мне нужно, чтобы оно работало с любой из двух идентичных баз данных, причем выбор основан на URL.Например:

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

Первое очевидное решение состоит в том, чтобы иметь два идентичных приложения CakePHP в myapp/foo и myapp/bar с различными конфигурациями базы данных.Однако это выглядит глупо, поэтому я пытаюсь найти элегантный способ создания одного приложения.

Подход, который я рассматриваю, заключается в следующем: определить маршруты так, чтобы 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?Хотя я избавляюсь от дублированного кода, я не могу избавиться от ощущения, что заменяю один запах кода другим.

Ответы [ 2 ]

1 голос
/ 02 августа 2011

Есть несколько способов сделать это, вот один.

Напишите замечательный маршрут, по которому вы всегда подходите:

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);
    }
}
0 голосов
/ 02 августа 2011

Так, например, после того, как вы выполните вставку в одну базу данных, они не будут "идентичными", верно?Эти 2 БД как-то синхронизированы друг с другом?Я не знаю, что вам нужно делать с этими БД, но, вероятно, проще просто сделать 2 отдельных приложения.

Да, вы можете указать конфигурацию БД в модели: http://book.cakephp.org/view/922/Database-Configurationно вы не можете изменить его «на лету» (модели, как полагают, не будут менять связь с другой таблицей).То, что вы делаете, это, вероятно, единственный способ.

У меня есть контроль над URL, поэтому я могу быть уверен, что в URL не будет посторонних повторений foo или bar

Да, могут быть «посторонние вхождения foo или bar в URL» :)) Но это не сломает ваше приложение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...