Mapper, SQLBuilder, Model .. Integração
Carinhas, eu tenho uma dúvida que está me perturbando, no mini-fw que estou fazendo para utilizar nos meus projetos, estou com um problema na parte relacionada ao mapeamento, na verdade, problemas eu ainda não tive em relação a isto, mas é uma dúvida de implementação, eu tenho o seguinte code ( demonstrativo ), também não sei se a implementação está certa, mas ..
<?php
abstract class Mapper {
private $model ;
final public function __construct ( ) {
if ( $this instanceOf Model ) {
$this->model = $this ;
if ( ! isset ( $this->model->_table ) ) {
# [ Hahahah, Exception mané ]
}
}
}
public function save ( DomainObject $domainObject ) ;
public function update ( DomainObject $domainObject ) ;
public function delete ( DomainObject $domainObject ) ;
}
abstract class Model extends Mapper {
}
abstract class DomainObject {
private $_fields = array ( ) ;
public function getFields ( ) {
return ( array ) $this->_fields ;
}
public function addField ( $fieldName , $value ) {
$this->_fields [ $fieldName ] = $value ;
}
}
Estes aí são os componentes que serão utilizados por uma model , e por uma entidade .. logo, essas minhas classes que irão extender a Mapper e DomainObject, terão acesso aos métodos addField ( utilizado nos setters da entidade ) e o save, update, delete ..
Perfeito, porém, a dúvida: O mapper extende o banco, ou o banco extende o mapper, porque, eu posso ter um mapper para PgSQL, MySQL .. em que a sintaxe talvez varie, não faz muito sentido pra mim o banco extender o mapper, porque não é o banco quem usa o mapper, e sim o mapper que usa o banco ..
Tem também a questão do escritor de SQL, quem iria utilizar ele ? o model também pode ter acesso a este, porque no model eu também posso escrever métodos que o mapper não provê, daí a SQL também seria diferente.
<?php
class Customers extends Model {
protected $_table = 'Clientes' ;
}
class ClientsEntity extends DomainObject {
private $nome ;
public function getNome() {
return $this->nome ;
}
public function setNome( $nome ) {
$this->nome = $nome ;
$this->addField('nome', $this->getNome());
}
}
$customer = new CustomersEntity();
$customer->setNome('teste');
$customers = new Customers();
$customers->save( $customer ) ;
Ou, no model eu deveria ter um método
setDatabaseConnection ( Connection $connection )
?
Discussão (13)
Carregando comentários...