Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá a todos, estou querendo dá um up nos meus conhecimentos e estou tentando implementar entendendo parte por parte de alguns padrões mais difíceis, portanto estou tentando criar um ORM, com fins de estudo somente, utilizando o data mapper e talvez o adapter ( que é de relativamente fácil ), mas estou me deparando com algumas dificuldades. Vamos às dificuldades:
1. Para cada objeto que representa uma entidade deve haver um mapper pra ele?
Ex.: Classe Pessoa deve possuir um PessoaMapper?
Pessoa:
<?php
class Pessoa {
public $nome;
private $mapper;
public function save() {
$this->mapper = new PessoaMapper();
$this->mapper->save($this);
}
}
?>
Algo parecido com isso? Realmente fiquei com dúvidas já que achei poucos materiais sobre o data mapper.
2. Onde realmente se encaixa o Lazy Loading no Data Mapper?
Obrigado pessoal :)
@Bruno Augusto
Primeiramente obrigado por responder. Eu após ter escrito o post fui pesquisar um pouco mais, logo me deparei com o que você disse que eu misturei o Data Mapper com o Active Record.
Mas e ai, como o Data Mapper trabalho com as relações ( n-n, 1-n )? Pelo o que imaginei é no puro SQL, ou o PersonMapper deve conhecer o AccountMapper ( caso exista uma relação entre Person e Account ) ?
;)
Essa resposta eu vou ficar te devendo.
Justamente pela ausência de material decente, minha implementação carece do suporte à JOIN's. Todo e qualquer relacionamento é codificado na unha.
>
Essa resposta eu vou ficar te devendo.
Justamente pela ausência de material decente, minha implementação carece do suporte à JOIN's. Todo e qualquer relacionamento é codificado na unha.
:) estou pesquisando bastante sobre o assunto e achei um post bem bacana:
http://blog.tekerson.com/2008/12/17/data-mapper-pattern-in-php/
A UnitOfWork to track which objects need saving, deleting and to co-ordinate roll backs on error, or the order of persistence to satisfy foreign key constraints.
Ele fala desse pattern Unit of Work, que eu desconheço. :/
@edit
Parando para pensar aqui, a real diferença entre o Active Record e o Data Mapper é só o desacoplamento do DO. Após criar um Mapper podemos herdar de um Mapper_Base no qual faz todo tratamento de relações. Então fica bem próximo do Active Record. Mas mesmo assim o nível de complexidade não muda muito, continua sendo difícil implementar :)
Para a primeira pergunta eu ACHO que da forma como fez, você misturou parte do Mapper com parte do Active Record.
Dada a complexidade do assunto e carência de bons materiais posso estar enganado, mas imagino que o correto seria algo como:
class Person {
class PersonMapper {
Saída:
object(Person)[1]
private 'name' => string 'Bruno Augusto' (length=13)
Eu quando implementei achei isso redundante pois tinha de repetir os métodos save() e cia em todos os Mappers, então criei um única classe que operaria qualquer tabela.
O código ficou bem mais complexo pois envolveu interfaces e classes abstratas, mas pelo menos evito tal repetição (DRY) e ainda anulo a necessidade de o Mapper conhecer o objeto mapeado (setters e getters).
Para a segunda pergunta eu diria que nesse seu código (e nem nessa adaptação minha) o Lazy Loading não se aplica porque as classes se conhecem, mesmo que não devessem.
Veja, o PersonMapper sabe que Person tem um nome que deve ser setado e que para isso ele dispõe do método Person::setName().
Já no exemplo que comentei sobre a minha implementação, como minha classe que manipula as entidades não sabe qual entidade está sendo designada para ela trabalhar, tenho um método de interface que informa quais são os campos mapeados nessa/dessa tabela.
Mais ou menos assim:
interface Table {
class MyTable implements Table {
class Manager {
Eu atraso a listagem dos campos ao momento em eles são realmente necessários e através da interface, eu garanto ao meu gerenciador que todas as tabelas possuem tal método.