terça-feira, 6 de novembro de 2012

Tô vendo tudo em dobro : Como utilizar dois ou mais banco de dados ao mesmo tempo com Zend

Muita gente tenta criar uma aplicação e se depara com o fato de ter de utilizar mais que um banco de dados ao mesmo tempo.

Uma situação típica : existe um aplicativo ( que não foi você quem fez ) que têm um banco de dados próprio e você não pode alterar os dados dele, somente ler.

Mas ao mesmo tempo você precisa usar esses dados para seu ERP feito em Zend, e não pode alterar o banco de dados do outro aplicativo, pois você precisa de um gerenciamento de usuários do seu ERP por exemplo.

Neste caso, você precisará criar um banco de dados próprio para seu ERP, e trabalhar junto com o banco de dados do outro aplicativo.

Então, vem a pergunta natural : como faço isso no Zend ? A resposta é surpreendentemente simples.


Para este post, considere dois banco de dados : 'db1' e 'db2'. O banco de dados 'db1' é do tipo 'dbtype1' ( onde 'dbtype1' pode ser o mysql, postgres, mssql, etc ) e o 'db2' seria do tipo 'dbtype2'.

No arquivo 'application/configs/application.ini' de seu projeto, configure esses banco de dados assim:


;; application/configs/application.ini

;; Configura o adaptador para 'db1' e o define como o adaptador padrão da aplicação.
resources.resourcealias.dbalias1.adapter  = pdo_dbtype1
resources.resourcealias.dbalias1.host     = host1
resources.resourcealias.dbalias1.username = userdb1
resources.resourcealias.dbalias1.password = passdb1
resources.resourcealias.dbalias1.dbname   = db1
resources.resourcealias.dbalias1.default  = true

;; Configura o adaptador para 'db2'.
resources.resourcealias.dbalias2.adapter  = pdo_dbtype2
resources.resourcealias.dbalias2.host     = host2
resources.resourcealias.dbalias2.username = userdb2
resources.resourcealias.dbalias2.password = passdb2
resources.resourcealias.dbalias2.dbname   = db2
resources.resourcealias.dbalias2.default  = false

Aqui devemos notar que 'resourcealias' é um apelido para esse recurso, 'dbalias1' e 'dbalias2' são apelidos para as conexões, 'pdo_dbtype1' e 'pdo_dbtype1' são os tipo de banco de dados, como 'pdo_mysql' para MySQL, 'pdo_pgsql' para PostgreSQL, etc. O resto é auto-explicativo, espero ...


Pois bem, definido a configuração dos bancos de dados, agora abramos o 'Bootstrap.php' e fazemos um 'inicializador':

public function _initDbRegistry(){

    $this->bootstrap('resourcealias');
    $obj = $this->getPluginResource('resourcealias');
    Zend_Registry::set('adapteralias1', $obj->getDb('dbalias1'));
    Zend_Registry::set('adapteralias2', $obj->getDb('dbalias2'));

}

E agora simplesmente, crie seu model e adicione:

class Meumodel1_Model extends Zend_Db_Table_Abstract {

    protected $_name    = 'uma_tabela_qualquer_do_db1';
    protected $_adapter = 'adapteralias1';

}

class Meumodel2 extends Zend_Db_Table_Abstract {

    protected $_name    = 'uma_tabela_qualquer_do_db2';
    protected $_adapter = 'adapteralias2';

}

E está pronto tudo o que você precisa para utilizar dois bancos de dados totalmente diferentes juntos. Definida a classe, você poderá criar os métodos e objetos de seus modelos como sempre utilizou com Zend, inclusive usando relacionamento de tabelas ( fiz um post sobre isso aqui ) sem problemas.

Eeeee até a próxima.




Referências