Dynamic Databases
Posted: May 19th, 2008 | Author: andre | Filed under: CakePHP | No Comments »Depois de procurar por muito tempo como fazer com que o cake utilizasse varias databases, consegui encontrar alguma informação mas nada que fosse oque eu estva procurando, então resolvi modificar o database.php pra poder usar um DB onde as informaões estariam guardadas em um banco.
o Caso:
Existe um tabela no banco onde se econtram informações sobre outro banco de dados, como fazer o cake utilizar essas informações e conectar a esse banco dinamicamente?
Solução:
isso soa mais como um hack do que uma solução, mas o que fiz foi fazer com que o database.php se conectasse primeiro ao banco principal e resgatasse as informações do banco secundário e ao mesmo tempo atribuir esses valores a variável do segundo banco.
class DATABASE_CONFIG { var $default = array('driver' => 'mysql', 'persistent' => false, 'connect' => 'mysql_connect', 'host' => 'localhost', 'login' => 'user', 'password' => 'pass', 'database' => 'pg_main', 'prefix' => ''); var $panel = array('driver' => 'mysql', 'persistent' => false, 'connect' => 'mysql_connect', 'host' => '', 'login' => '', 'password' => '', 'database' => 'pg_website', 'prefix' => '');
Criei além da conexão default uma conexão $panel em branco. Então dentro da classe database criei o metodo construtor para resgatar os valores do banco default.
function DATABASE_CONFIG() { $domain = $_SERVER['HTTP_HOST']; //remove any www. $domain = str_replace('www.', '', $domain); $domain = str_replace('.localhost', '', $domain); //$domain = 'pgwebsite'; //connect to the default server and get the info about the cliente database $link = mysql_connect($this->default['host'], $this->default['login'], $this->default['password']); if (!$link) { die("Erro na conexao"); } elseif (!mysql_select_db($this->default['database'], $link)) { die("Erro na conexao"); } echo mysql_error(); if (($result = mysql_query('select * from websites',$link))) { $someone = mysql_fetch_assoc($result); } //set the database array for the panel conector $this->panel['host'] = $someone['dburl']; $this->panel['login'] = $someone['dbuser']; $this->panel['password'] = $someone['dbsenha']; mysql_close($link); }
Nota-se que é um metodo simples, mas realmente é bastante funcional qdo vc trata de varias conexões, neste exemplo a variável $user era setada por meio de leitura da url em um alias, ex. meusite.dominio.com, sendo assim resgatando as informações do usuário “meusite” no banco $default.
Depois é só utilizar $useDbConfig nos seus models para usar o banco $panel:
<code><?php class Model extends AppModel { var $name = 'Model';var $useDbConfig = "panel"; } ?></code>
O Principal motivo de utilizar este metodo é que se vc setar o banco durante o runtime do cake ele não é utilizavel via $useDbConfig no model.
Leave a Reply