Jaime Neto | desenvolvimento para web

jan/10

26

Melhorando o Zend_Db_Table – Parte 1: Evitando chaves que não correspondem à colunas


Faz muito tempo que não posto nada no blog, então resolvi começar a compartilhar algumas soluções que venho desenvolvendo para Zend Framework, que pode ser útil pra muita gente que o utiliza.

Uma das grandes críticas que vejo sobre o ZF é o uso do Zend_Db_Table, por diversos motivos, então, para começar vou postar algumas soluções que venho desenvolvendo para facilitar meu trabalho no uso dessa abstração de banco de dados.

Para começar, uma das coisas que me aborrecia sempre que ia dar um insert ou update na tabela, era quando eu passava os dados do formulário para um desses métodos, e o ZF me jogava uma excessão dizendo que não existe uma coluna de nome tal, que foi passada no array de dados. Pra deixar mais claro, vamos pegar o seguinte cenário:

Temos uma tabela “Usuarios”, com os campos “id”, “nome” e “email”, por exemplo. E uma classe modelo Usuarios que herda de Zend_Db_Table_Abstract. Ao inserirmos os dados de um usuário, o formulário está mandando também o nome do botão “Salvar”.

$tbUsuarios = new Usuarios();
$dados = $this->_request->getPost();
/*
  Digamos que esse seja o valor de $dados:
  $dados = array(
    'nome' => 'Fulano de Tal',
    'email' => 'fulano@email.com',
    'salvar' => 'Salvar'
  )
*/
unset($dados['salvar']);
$tbUsuarios->insert($dados);

Veja que foi necessário um unset() para remover a chave que não corresponde à colunas da tabela. Óbvio que esse é um exemplo simplificado, e pode parecer uma bobagem, mas imagine um cenário maior e mais complicado onde cada chave não correspondente à uma coluna teria que ser excluída do array a fim de evitar a excessão lançada pelo Zend_Db_Table. E, acredite, isso pode se tornar um pé-no-saco, principalmente quando você tem que fazer alterações no formulário e acaba colocando mais uma chave que não corresponde à uma coluna, daí vem mais um unset().

Então, entendido o problema, vejamos a forma que encontrei para que não seja mais necessário nos preocuparmos com dados não correspondentes à colunas:

require_once 'Zend/Db/Table/Abstract.php';
 
class My_Db_Table_Abstract extends Zend_Db_Table_Abstract
{
  /**
   * Filtra os itens do array de dados, verificando se as
   * chaves correspondem a campos da tabela
   *
   * @param array $data Array de dados
   * @return array Array de dados filtrados
  **/
  protected function _filterData(array $data)
  {
    $cols = $this->info('cols');
    $filteredData = array();
    if($data) {
      foreach($data as $key=>$value) {
        if (in_array($key, $cols)) {
          $filteredData[$key] = $value;
        }
      }
    }
    return $filteredData;
  }
 
  public function insert(array $data)
  {
    $data = $this->_filterData($data);
    return parent::insert($data);
  }
 
  public function update(array $data, $where)
  {
    $data = $this->_filterData($data);
    return parent::update($data, $where);
  }
}

Agora é só fazer com que a classe Usuarios herde de My_Db_Table_Abstract e pronto.
Veja que, desta forma, as chaves do array não correspondentes à colunas da tabela serão automaticamente filtrados, e não será mais exibida excessão relativa a esse caso específico.

·

No comments yet.

Leave a Reply

<<

>>

Theme Design by devolux.nh2.me