Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde a todos, gostaria de compartilhar com vocês uma classe para mapeamento objeto/relacional.
Estou com certos problemas em objetos que possuem objetos dentro de seus atributos, coisa que é muito normal na maioria das aplicações.
Vou colocar aqui o código da classe e embaixo estarei comentando.
Design Patterns: nesse caso Data Mapper, agora com os outros metodos para implementar o CRUD, seria Row Data Gateway.
Design Patterns do Projeto:
MVC, POJO( a mesma ideia só que em PHP ), DAO e etc.
class MapObjetoRelacional {
private $objeto = array();
public function ArrayToObject($classe, $row){
$class_methods = get_class_methods($classe);
foreach ($class_methods as $name) {
if($name[0] == 's'){
$atributo = str_replace("set", "", $name);
$atributo = strtolower($atributo);
$tam = strlen($atributo);
$valor = $row["$atributo"];
if($atributo[($tam-2)] == 'f' && $atributo[($tam-1)] == 'k'){
$atributo = str_replace("_fk", "", $atributo);
$SubClasse = ucfirst($atributo);
$obj = new $SubClasse();
//Se todas as pks forem o campo codigo
$obj->setCodigo($valor);
}else{
$this->objeto[$i]->$name($valor);
}
}
}
return $this->objeto;
}
public function ObjectToArray($objeto){
$vet = array();
$classe = get_class($objeto);
$class_methods = get_class_methods($classe);
foreach ($class_methods as $name) {
if($name[0] == 'g'){
$valor = $objeto->$name();
if(is_object($valor)){
//Se todas as pks forem o campo codigo
$valor = $valor->getCodigo();
}else{
0;
}
$atributo = str_replace("get", "", $name);
$atributo = strtolower($atributo);
$vet[$atributo] = $valor;
}
}
return $vet;
}
}
Primeiro problema, como diz no comentário, só funciona se o campo PK for o campo código ( Coisa que nem sempre ocorre, como no meu TCC, a entidade Usuario, sua PK é o login já que o login deve ser único, sendo assim ele identifica a entidade).
Segundo problema, se o objeto passado por parâmetro para o método ObjectToArray(), possuir um objeto que alem do código possua outros valores setados ( o que também ocorre muito ), os valores não são armazenados.
Terceiro problema, se a array que for passada por parametro para o metodo ArrayToObject(), que provavelmente será a $row, for resultado de uma seleção com JOIN's, preciso nem dizer...
Com base nessa logica, possuo uma classe de mapeamento objeto/relacional que efetua ações CRUD, ela retorna ou um booleano (no caso de create, delete e update), objeto ou objetos (no caso do Read) para o pacote DAO( Todas as classes herdam da MapObjetoRelacional e implementam a BaseDAO ) que está dentro do pacote Model.
para visualizar o código completo: Clique aqui
Se alguém tiver uma ideia de como melhorar esses metodos ObjectToArray() e ArrayToObject() por favor entre em contato comigo para que possamos desenvolver uma solução.
Estou desistindo de implementa-los no TCC pois não posso demorar, mas não estou desistindo de faze-lo.
Estou ciente que existem frameworks(doctrine, cake e etc) no mercado que fazem esse papel, porém não estou interessado em usa-los, quero mesmo é fazer para melhor compreensão e um pouco de pratica e diversão.
Obrigado.
OBS: Duas maneiras foram pensadas, porém não implementadas:
1 - Criar um atributo em cada POPO para armazenar a chave primaria de sua respectiva entidade;
2 - Criar um arquivo XML para mapear as entidades.
Irei implementar assim que possível e estarei disponibilizando aqui.
Sugestões?!
Carregando comentários...