Gerador de classes getter e setters do banco de dados (Mysql)

0

Posted on : 25-07-2006 | By : .rafa | In : PHP, Programação

DOWNLOAD
Source : codeGen.phps

Atualmente em meus trabalhos feitos em PHP utilizo alguns frameworks.

* smarty PHP (do grupo PHP.net)
* pear.php.net (do grupo PHP.net)
* package DB.pear.php.net
* package HTML_AJAX.pear.php.net
* E para desenvolvimento a ferramenta da Zend o ZendStudioClient 5.0

E desta forma tenho como controlar via ajax as entradas de dados e minhas templates, mas sempre há uma variável que é apresentada, a do javascript
desabilitado ou não carregado por completo.
E o controle fica somente na programação do meu php, onde tenho que ficar fazendo if e tals, mas para simplificar resolvi fazer essa classe que gera
classes e objetos que ao serem criados eles tem caracteristicas próprias onde eu ou qualquer programador teria que escrever. Como por exemplo:
O usuário, senha da tabela de usuários tem que ser informado, obrigatoriamente.
Ai pensei em fazer uma classe

class Usuario {
private $_idusuario;
private $_idpessoa;
private $_senha;
public function getIdusuario() {
return $this->_idusuario;
}
public function setIdusuario($intIdusuario) {
$this->_idusuario = $intIdusuario;
}
public function getIdpessoa() {
return $this->_idpessoa;
}
public function setIdpessoa($intIdpessoa) {
$this->_idpessoa = $intIdpessoa;
}
public function getSenha() {
return $this->_senha;
}
public function setSenha($strSenha) {
$this->_senha = $strSenha;
}



Mas mesmo assim tinha que ficar escrevendo muito para fazer uma coisa tão simples que controla oq ?
E detalhe como uso o ZendStudio ele não ajuda nisso, dai teria que ficar abrindo o eclipse para fazer isso e depois o zend novamente o trabalheira.
Observando a estrutura do banco vi que minha tabela USUARIO do banco tem toda essa estrutura e mais:

    IDUSUARIO INT(11) NOT NULL PRIMARY KEY
    USUARIO   TEXT    NOT NULL
    SENHA     TEXT    NOT NULL
    ATIVO     CHAR(1) NOT NULL

Então poderia fazer melhor na minha classe:

class Usuario {
private $_idusuario;
private $_idgrupo;
private $_idpessoa;
private $_senha;
private $_fieldsRequired = array();

public function getIdusuario() {
return $this->_idusuario;
}
public function setIdusuario($intIdusuario,$require = "T") {
$this->_idusuario = $intIdusuario;
$this->setFieldRequire("idusuario",$require);
}
public function getIdgrupo() {
return $this->_idgrupo;
}
public function setIdpessoa($intIdpessoa,$require = "T") {
$this->_idpessoa = $intIdpessoa;
$this->setFieldRequire("idpessoa",$require);
}
public function getSenha() {
return $this->_senha;
}

public function setSenha($strSenha,$require = "T") {
$this->_senha = $strSenha;
$this->setFieldRequire("senha",$require);
}
private Function setFieldRequire($strField,$boolRequired = "F") {
if ( (strtoupper($boolRequired) == "T") || ($boolRequired === 1) ) {
$ma = $this->_fieldsRequired;
$c = count($ma);
$achou = false;
for ($i = 0; $i < $c; $i++ ) {
if ($ma[$i] == trim($strField)) {
$achou = true;
break;
}
}
if (!$achou) {
$ma[++$c] = trim($strField);
}
$this->_fieldsRequired = $ma;
}
}

E agora estaria controlando os meus objetos antes deles serem inseridos no banco, ai pensei.. tenho que saber se o objeto foi informado ou não
entao fiz mais alguns métodos.

Continuação do código anterior

protected Function isRequired($strField) {
$ma = $this->_fieldsRequired;
$c = count($ma);
$achou = false;
if ($c > 0) {
foreach ($ma as $value) {
if ($strField == $value) {
$achou = true;
break;
}
}
}
return $achou;
}
public Function haveErrors() {
$ma = $this->_fieldsRequired;
$c = count($ma);
if ($c > 0) {
foreach ($ma as $value) {
$var = call_user_method("get".$value, $this, "") ;
if (empty($var)) {
return true;
break;
}
}
}
return false;
}
public Function haveError($strField = "",$res1 = true,$res2 = false) {
$ma = $this->_fieldsRequired;
$c = count($ma);
if ($c > 0) {
foreach ($ma as $value) {
$var = call_user_method("get".$value, $this, "");
if (strtoupper(trim($strField)) == strtoupper($value) && (empty($var))) {
return $res1;
break;
}
}
return $res2;
} else {
return $res2;
}
}
public Function arrayErrors() {
$retorno = "";
$c = 0;
if ($this->haveErrors()) {
$ma = $this->_fieldsRequired;
foreach ($ma as $value) {
$var = call_user_method("get".$value, $this, "") ;
if (empty($var)) {
$retorno[$c++] = $value;
}
}
return $retorno;
} else { return false; }
}

Legal teria que dar Ctrl+C e Ctrl+V em todas as minhas classes, mas o essencial e erros de digitação eu estaria vulnerável.

NECESSIDADE
1. Algo mais automatizado para geração de classes dos meus objetos do banco que são os mesmos que vão aparecer nos meus programas PHP.

OBJETIVO
1. Gerar as classes automaticamente;
2. Controlar se o objeto é obrigatório ou não
3. A classe seja gerado dentro de um arquivo em formato php
4. Que esta classe gerada seja compativel com a versao PHP 5 ou superior
5. E esta classe possa ser alterada caso seja necessário ou extendida.

SOLUÇÃO
1. Code Generator
Source : codeGen.phps

REQUISITOS
1. Conhecer OOP para PHP
2. Ambiente para usar essa classe codeGen.php deve conter a packageDB da pear.php.net e obviamente a package principal da PEAR.php.net
3. Bando de dados MySQL com a estrutura que desejas transformar em classes

COMO USAR


// Package DB.pear.php
include_once('DB.php');

// Criação do objeto já estabelecendo a conexão com o banco de dados
// deve-se observar o ultimo parametro true, ele já vem como default false,
eh o indicador do debug, mostra o que está fazendo
$codeGen = new CodeGenerator('localhost','database','root','123456','mysql',true);
// Para a documentação da classe e dizer quem fez a classe
$codeGen->setAuthor("Rafael Stoever");
// Serve para rodar e gerar o script da tabela pessoa
$codeGen->run("pessoa");
// Serve para rodar e gerar o script da tabela usuario
$codeGen->run("usuario");


DETALHES INDISPENSÁVEIS
Deve ser observado que ao usar a classe da DB.pear.php.net podemos gerar scripts para vários bancos de dados, como oracle, pgsql e outros, mas como estou fazendo em minha casa onde só tenho MySQL instalado nao tive como fazer o processo em outros bancos. E assim que for feito em outro banco deve ser observado as classes do codeGenerator

          + getTableStructure()
          + CodeGenConnect()
          + abrTypes()
          + addFieldType()

Pois estes metodos tratam propriedades que vem do banco de dados, como tipagem de campos.
E do getTableStructure() deve ser visto como vem as flags do banco, no mysql vem como not_null para not null e em branco para null, e para as chaves
primárias aparece ao lado primary key, em outros bancos podem conter informacoes diferente ou em maiusculas. Se ativar o debug naquele momento irá aparecer a descrição que deve ser tratada e inserida.
(getTableStruture) Campos de controle do campo[idUsuario] flags->not null primary key
Esse foi o meu debug com o mysql da minha maquina.

E para mais detalhamento pode ficar a vontade de me questionar via comentário

Post a comment

*