mar 16

Configurando o Banco de Dados no Zend Framework

Banco de Dados, Programação, Zend Framework 10 Comentários Zend Framework

Nos últimos artigos técnicos escrevi sobre como montar a estrutura de um projetos com Zend Framework e como criar sua primeira aplicação usando a estrutura criada, mas nessa primeira aplicação não fazíamos uso de um banco de dados, o que na maioria dos casos é diferente. Boa parte das aplicações desenvolvidas para a web fazem uso de algum tipo de armazenamento de dados, seja eles utilizando bancos de dados em texto ou banco de dados no modelo objeto-relacional. Dessa forma nesse artigo vou mostrar como é possível configurar a conexão a esses bancos de dados utilizando Zend Framework.

Como quase tudo no Zend Framework existem diversas formas de se configurar a conexão com o banco de dado na sua aplicação, vou tentar mostrar algumas delas dizendo quais são os pontos positivos e negativos de cada uma:

Algumas Premissas Necessárias

Segundo a documentação oficial do Framework os seguintes bancos de dados são suportados de forma nativa: MariaDB,  MySql, IMB DB2, Microsoft SQL Server, Oracle, PostgreSQL, SQLite, Firebird. É uma lista bem extensa e com certeza cobre a imensa maioria das aplicações web hoje, mas caso seu banco de dados não esteja na lista isso não significa que você não poderá utilizá-lo, você ainda pode criar seu próprio adaptador, mas esse seria um tópico bastante avançado que não é o objetivo desse artigo.

Portanto, para que você consiga realizar a conexão que irei mostrar através desse artigo estou supondo que você já tenha configurado um desses SGBD`s e já tenha criado um banco de dados para uso nessa aplicação. Se ainda não o fez ou não sabe como fazer sugiro que consulte a documentação específica do seu SGBD pois não seria possível nesse artigo apenas mostrar como configurar cada um desses individualmente (nem eu mesmo saberia como fazer em todos eles).

Inicialização Individual do Banco de Dados

Se sua aplicação usa pouco o banco de dados e somente em algumas partes dela essa talvez seja uma solução adequada para você nesse momento, pois permite que você possa inicializar o banco de dados, quando e somente quando você necessitar dessa conexão, para tanto você deve apenas usar a seguinte instrução no seu Controller:

$db = new Zend_Db_Adapter_Pdo_Mysql(array(
    'host'     => 'localhost',
    'username' => 'usuário',
    'password' => 'senha',
    'dbname'   => 'nome_do_banco_de_dados'
));

Vamos a explicação, a primeira linha dessa instrução inicializa a classe do adaptador referente ao banco de dados específico que você está usando (uma lista completa de todos os adaptadores pode ser encontrada no final da Documentação de Banco de Dados do Zend Framework), você deve portanto substituir pela classe correta do adaptador do seu banco de dados.

Como parâmetro dessa inicialização são passados os dados de conexão com o banco de dados, que podem variar um pouco de um SGBD para outro mas são basicamente esses:

  • Host: Ip, Caminho ou URL do seu servidor do seu SGBD
  • Username: Nome de Usuário para conexão com o SGBD
  • Password: Sua senha para conexão com o SGBD
  • DBName: Nome do banco de dados específico

A partir dai basta você executar sua instrução SQL através da classe criada e armazenada na variável $db como no exemplo a seguir:

$sql = 'SELECT * FROM MyTable WHERE tableId = 2';
$result = $db->fetchAll($sql);

Conexão Utilizando Zend_Db::factory()

A função estática factory da classe Zend_Db inicializa a classe do banco de dados automaticamente através da Zend_Loader::loadClass() da classe e retorna uma instância dessa classe para usar factory tudo que você tem que fazer e substituir a instrução de conexão pela seguinte:

$db = Zend_Db::factory('Pdo_Mysql', array(
    'host'     => 'localhost',
    'username' => 'usuario',
    'password' => 'senha',
    'dbname'   => 'nome_do_banco_de_dados'
));

Como disse anteriormente essas duas formas de realizar a conexão são muito úteis se sua aplicação se conectar pouquíssimas vezes com o banco de dados, pois você terá que inicializá-lo toda vez que for usá-lo e ainda terá que armazenar os dados de conexão em cada um dos Controllers que forem realizar a conexão, caso um dia esses dados mudem você terá um trabalho imenso para substituir cada um deles.

Conexão Individual Utilizando um Arquivo de Configuração

Para resolver o problema anteriormente apresentado você pode armazenar as informações de conexão em um arquivo de configuração e buscar essas informações desse arquivo quando for realizar a conexão, dessa forma se os dados de conexão mudarem você terá que atualizá-los em somente um arquivo.

Se você está usando a estrutura apresentada nos artigos anterior, recomendada pela Zend ou realizou a criação do seu projeto usando Zend Tool, você já tem um arquivo de configuração na sua aplicação, que está localizado dentro de application/configs/application.ini para esse artigo iremos usar esse arquivo mesmo, mas a medida que sua aplicação for crescendo você pode querer organizar melhor as configurações em diferentes arquivos, você poderá fazer isso sem problema algum.

Adicione as seguintes linhas ao seu arquivo (no lugar correspondente ao servidor que estiver usando) e substitua os dados pelos dados de conexão referentes ao seu SGBD:

db.adapter = PDO_MYSQL
db.params.host = localhost
db.params.username = usuario
db.params.password = senha
db.params.dbname = nome_do_banco_de_dados

Agora o que você tem que fazer quando for usar o banco de dados e substituir o código usado nos exemplos anteriores pelo seguinte:

$config = new Zend_Config_Ini('../application/configs/application.ini');
$db = Zend_Db::factory($config->db);

Dessa forma você estará passando como parâmetro para o método estático factory() os dados contidos no seu arquivo de configuração.

Conexão Através da Classe de Bootstrap

Nas formas anteriores você tinha que instanciar o banco de dados toda vez que ele fosse ser usado, o que pode ser bom quando a aplicação se utiliza pouco de conexões a bancos de dados, pois evita que sua aplicação seja sobrecarregada com conexões desnecessárias ao banco, mas quando a maioria ou a totalidade da aplicação se utiliza de conexões ao banco de dados o ideal é que essa conexão seja inicializada juntamente com sua aplicação e permaneça ativa durante toda ela, e isso pode ser feito através do arquivo bootstrap.php localizado na raiz do diretório application

Para isso basta criar o seguinte método nessa classe:

protected function _initConnection()
{
	$config = new Zend_Config_Ini('../application/configs/application.ini', APPLICATION_ENV);
	try{
		$db = Zend_Db::factory($config->db);

		// Registra o banco de dados
		$registry = Zend_Registry::getInstance();
		$registry->set('db', $db);

		Zend_Db_Table::setDefaultAdapter($db);
	}catch(Zend_Db_Exception $e){
		echo "Não foi possível realizar a conexão com o banco de dados.";
		exit;
    	}
}

Todo o método protected cujo nome inicia com “_init” da sua classe bootstrap é inicializado juntamente com sua aplicação, dessa forma, esse método será automaticamente inicializado junto com sua aplicação, realizará a conexão com o banco de dados através do método estático Zend_Db::factory() e em seguida registrará esse método através de Zend_Registry quando você for utilizar o banco de dados basta recuperá-lo usando a seguinte instrução:

$registry = Zend_Registry::getInstance();
$db = $registry->get('db');

O método _initConnection também registra o objeto do banco de dados como adaptador padrão de banco de dados para a aplicação, dessa forma os models que forem criados nessa aplicação farão uso por padrão desse banco de dados.

Conclusão

Como dito anteriormente existem diversas formas de se realizar a conexão com o banco de dados no Zend Framework, eu sempre procuro mostrar essas diversas formas para que cada um possa escolher a que melhor se adapta a sua aplicação, mas se você planeja um crescimento para sua aplicação e o uso de models nela, recomendo que faça uso da última maneira descrita, pois já registra seu banco de dados como padrão e mantem as informações de conexão em um arquivo de configuração separado para que caso algo tenha que ser alterado seja feito alterando somente um arquivo. O uso de models porem é um assunto para um próximo artigo.

10 comentários sobre “Configurando o Banco de Dados no Zend Framework”

  1. [...] artigo anterior falei sobre como Configurar um Banco de Dados com Zend Framwork deixando esse banco acessível para que pudesse ser acessado por nossos models, naquele artigo já [...]

  2. Franklim disse:

    Muito bom….

  3. [...] escrevi aqui no blog sobre como Configurar um Banco de Dados com Zend Framework e Trabalhar com  Modek no Zend Framework, porém em muitos casos além de acessar as entradas no [...]

  4. Brayan disse:

    Fala Paulo, muito interessante o artigo, parabéns.
    Você poderia me dizer como fazer essa conexão com um banco de dados firebird?
    Tentei assim:

    $this->db = new ZendX_Db_Adapter_Firebird(array(
    // $this->db = new Zend_Db_Adapter_php_interbase(array(
    'host' => '127.0.0.1',
    'username' => 'SYSDBA',
    'password' => 'masterkey',
    'dbname' => 'TESTE'
    ));

    mas não deu certo, alternei a primeira linha com a linha que está comentada e tb não consegui.
    Necessito fazer isto com urgência, agradeço muito se vc conseguir.
    Obrigado

    • Paulo Eduardo disse:

      Ola Bryan

      Sinceramente nunca trabalhei com Interbase mas acredito que se você inlcuir esse código no seu arquivo de configuração:

      db.adapter = ZendX_Db_Adapter_Firebird
      db.params.host = 127.0.0.1
      db.params.username = SYSDBA
      db.params.password = masterkey
      db.params.dbname = TESTE

      E utilizar esse código quando necessitar do banco de dados:

      $config = new Zend_Config_Ini('../application/configs/application.ini');
      $db = Zend_Db::factory($config->db);

      Deva funcionar, você também pode fazer uso do método _initConnection() no seu bootstrap da mesma forma como está ilustrado no artigo.

      Espero ter ajudado e se puder me avise do resultado que obtiver quando testar.

      • Brayan disse:

        Paulo fiz uns testes aqui e acho que consegui da seguinte maneira:

        $this->db = new ZendX_Db_Adapter_Firebird(array(
        'host' => '127.0.0.1',
        'username' => 'SYSDBA',
        'password' => 'masterkey',
        'dbname' => 'C:\fb\TESTE.FDB'
        ));
        

        o que eu tive que fazer foi baixar o zend framework full, e na pasta extras tinha o ZendX com o Adapter para o Firebird.
        Aparentemente deu certo, preciso efetuar mais testes mas por enquanto ta dando certo :D

  5. Fernando disse:

    Olá, muito bons seus artigos sobre o ZF.
    Gostaria de elucidar uma dúvida, a qual você deve ter a resposta pronta. Preciso fazer uma aplicação que utiliza dois banco de dados em diferentes servidores. O ZF suporta ORM nativamente? Posso setar nas minhas classes no Model qual banco acessar individualmente por objeto?
    Obrigado desde já pela ajuda.

    • Paulo Eduardo disse:

      Ola Fernando, tudo bem?

      A lista completa dos adaptadores de banco de dados suportados pelo Zend Framework encontre-se no inicio dessa página: http://framework.zend.com/manual/en/zend.db.adapter.html
      É preciso se ater entretanto que alguns desses adaptadores encontram-se dentro da pasta ZendX da biblioteca que só esta disponível na versão completa do framework, verifique se essa pasta está dentro do seu diretório library ou no include path do seu servidor, se não estiver basta realizar o download no site da zend e incluir a pasta.
      Além dos bancos de dados nativamente suportados outros adaptadores não oficiais ainda podem ser encontrados na internet.

      Com relação a utilizar dois bancos de dados você precisaria incluir a seguinte linha no construtor do seu model:
      Zend_Db_Table::setDefaultAdapter($db);

      Onde $db é aquele valor retornado pelo método estático Zend_Db::factory descrito nesse mesmo artigo e que foi incluído na classe de registro do zend framework, usando dois bancos de dados você faria duas configurações quase idênticas porem salvaria em variáveis diferentes ($db1 e $db2 por exemplo).

      Obrigado pelo comentário e espero ter ajudado.

  6. Douglas R C disse:

    Valeu pela dica!

    Corrige ai no script do Bootstrap
    —————————————–
    try {
    $db = Zend_Db::factory($dconfig->db);
    —————————————–
    Está escrito $dconfig-db
    Muda pra $config-db

    Tem um “d” a mais ai. =)

Deixe um Comentário