Я работаю над проектом, где пользователь регистрируется и получает бесплатный интернет-магазин, используя CakePHP v2.6.5. Я использую виртуальный хостинг, поэтому я не могу создать для них базу данных Mysql, поэтому вместо этого я использую sqlite. Потому что мне тоже нужно использовать его с мобильным приложением. В моем коде я динамически создаю файл sqlite для пользователя после его регистрации. Но я не знаю, как изменить путь к базе данных в CakePHP. Все, что я знаю, это использование CakePHP в config/database.php
файл, но я не могу инициировать его динамически.
В моем config/database.php
файл:
public $sqliteDB = array(
'datasource' => 'Database/Sqlite',
'persistent' => false,
//'database'=>'',
'prefix' => '',
'encoding' => 'utf8'
);
Я пытаюсь перейти по этой ссылке:
База данных коммутатора CakePHP (использующая тот же источник данных) на лету?
и эта ссылка
Cakephp не может изменить базу данных на лету, но я ничего не получил
Я понимаю, как это сделать путем создания ConnectionManager
на лету в __construct()
метод модели. Но я использую его с несколькими таблицами, поэтому здесь мой код
В AppModel:
public function connectSqlite()
{
App::uses('CakeSession', 'Model/Datasource');
$shop = CakeSession::read('SHOP'); //just read Session for shop's name, because i create a directory and store sqlite in it. Directory name base on shop name that user defined when user registerd.
if($shop)
{
$dbName=FILES_URL.'shops'.DS.$shop['name'].DS.'database'.DS.'database.sqlite'; //Sqlite file path
$sqliteDB = array(
// Set correct database name
'datasource' => 'Database/Sqlite',
'persistent' => false,
'database'=>$dbName,
'prefix' => '',
'encoding' => 'utf8'
);
// Add new config to registry
ConnectionManager::create($dbName, $sqliteDB); //create ConnectionManager and return it to derived class.
// Point model to new config
return $dbName;
}
}
В модели продукта:
public function __construct($id = false, $table = null, $ds = null)
{
$dbName=parent::connectSqlite();
if($dbName){
$this->useDbConfig=$dbName;
}
parent::__construct($id, $table, $ds);
}
Надеюсь, что это может помочь!
Других решений пока нет …