Foros del Web » Programando para Internet » PHP » Zend »

Data Mapper

Estas en el tema de Data Mapper en el foro de Zend en Foros del Web. Hola, estoy intentanto implementar el patrón Data Mapper en mi aplicación y lo he hecho de la siguiente manera. Mi pregunta es si es correcto ...
  #1 (permalink)  
Antiguo 19/05/2011, 12:22
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Pregunta Data Mapper

Hola,

estoy intentanto implementar el patrón Data Mapper en mi aplicación y lo he hecho de la siguiente manera. Mi pregunta es si es correcto o no.

Por un lado, tengo una instancia de Zend_Db_Table_Row_Abstract que me sirve como entidad de una fila de la base de datos y dónde puedo añadir métodos propios (aparte de los clásicos setters y getters):
Código PHP:
Ver original
  1. class Application_Model_DbTableRow_Users
  2.     extends Zend_Db_Table_Row_Abstract
  3. {
  4.      public function getFullName() {
  5.           return $this->_name.' '.$this->_surname;
  6.      }
  7. }
Por otro lado, tengo una instancia de Zend_Db_Table_Abstract que me sirve para hacer operaciones globales sobre la tabla en cuestión como, por ejemplo, hacer búsquedas o hacer actualizaciones de varios registros:
Código PHP:
Ver original
  1. class Application_Model_DbTable_Users
  2.     extends Zend_Db_Table_Abstract
  3. {
  4.      protected $_name = 'users';
  5.      protected $_rowClass = 'Application_Model_DbTableRow_Users';
  6.  
  7.      public function existsName($name)
  8.      {
  9.          // ....
  10.      }
  11. }
Entonces, para crear un nuevo registro entiendo que habría que hacer algo así:
Código PHP:
Ver original
  1. // controller - action
  2. $user  = new Application_Model_DbTableRow_Users();
  3. $user->setName($name);
  4. $user->setSurname($name);
  5. $user->insert();
Y, para obtener un user en concreto:
Código PHP:
Ver original
  1. $users = new Application_Model_DbTable_Users();
  2. $user = $users->findLastCreatedUser(); // esto devuelve un Application_Model_DbTableRow_Users
  3. $user->getFullname();
¿Qué les parece? ¿Es correcto? ¿Alguna sugerencia para mejorarlo?

Muchas gracias!
  #2 (permalink)  
Antiguo 19/05/2011, 12:25
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Data Mapper

Que tal jerkan,

En el Quickstart tenes una implementación basica de un mapper.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #3 (permalink)  
Antiguo 19/05/2011, 15:06
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Data Mapper

Gracias por conterstar, masterpuppet.

Lo que no acabo de entender es por qué, en el quickstart, el mapper no hereda de Zend_Db_Table_Abstract ni el modelo de Zend_Db_Table_Row_Abstract.

EDITO: Ahora que me fijo bien, en el quickstart hay tres clases:

// Una clase representativa de la tabla que sólo contiene el nombre de la tabla
class Application_Model_DbTable_Guestbook extends Zend_Db_Table_Abstract

// Una clase mapper
class Application_Model_GuestbookMapper

// Una clase para representar una fila en la base de datos
class Application_Model_Guestbook

¿Son necesarias tantas clases?

Última edición por jerkan; 19/05/2011 a las 15:30
  #4 (permalink)  
Antiguo 19/05/2011, 15:43
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Data Mapper

Porque un mapper no tiene nada que ver con Zend_Db_Table_Abstract, ni un modelo con Zend_Db_Table_Row_Abstract, el modelo debería estar aislado de la persistencia, seria algo así:

Model <- Mapper -> Dao

Y si son necesarias si queres separar completamente las capas, osea utilizar DataMapper.

Implementar correctamente DataMapper no es algo simple, te sugiero que para este fin utilices Doctrine, de ser posible la versión 2.

Nota: el nombre del mapper esta mal, no esta utilizando el namespace correcto, deberia ser Application_Model_Mapper_Guestbook, no se como no lo corrigieron todavía.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #5 (permalink)  
Antiguo 19/05/2011, 16:14
Avatar de jerkan  
Fecha de Ingreso: septiembre-2005
Mensajes: 1.607
Antigüedad: 18 años, 7 meses
Puntos: 19
Respuesta: Data Mapper

Sigo sin entenderlo. A ver si haciendo la pregunta de otro modo lo veo claro.

¿Qué desventajas tiene implementar la arquitectura que proponía en el primer post?

Es decir,

class Application_Model_DbTableRow_Users extends Zend_Db_Table_Row_Abstract
class Application_Model_DbTable_Users extends Zend_Db_Table_Abstract
  #6 (permalink)  
Antiguo 19/05/2011, 16:28
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 3 meses
Puntos: 845
Respuesta: Data Mapper

Que es lo que no entiendes ?, lo que planteas no es DataMapper, es la implementacion por defecto de Zend, Table Data Gateway y Row Data Gateway, la desventaja mas grande es que atas los modelos a la persistencia, en este caso a una bbdd.

Te sugiero que busques info sobre los patrones para que veas los pros y contras de cada uno y en base a eso evaluar que te sirve mas.

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: dbtable, dbtablerow, frameworks-y-php-orientado-a-objetos, mapper
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 07:46.