Ver Mensaje Individual
  #10 (permalink)  
Antiguo 20/08/2011, 06:55
Avatar de masterpuppet
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: Object Oriented en la cruda realidad

Que tal drieran,

Creo que no lo estas viendo correctamente, para mi el approach de RonRuby es el adecuado, talves en el ejemplo no se ve claro, y en un mundo ideal el modelo debería estar aislado completamente del mecanismo de persistencia, podría ser algo asi:

model
Código PHP:
Ver original
  1. class User
  2. {
  3.     protected $_name;
  4.     protected $_email;
  5.     protected $_address;
  6.     protected $_phone;
  7.     /*getters && setters*/
  8. }

mapper
Código PHP:
Ver original
  1. class UserMapper
  2. {
  3.     protected $_dao;
  4.  
  5.     public function __construct(UserDao $dao)
  6.     {...}
  7.  
  8.     public function findById($id)
  9.     {
  10.         $record = $this->_dao->find((int)$id);
  11.         $user   = new User();
  12.         $user->setName($record['name'])
  13.              ->setEmail($record['email'])
  14.              ->setAddress($record['address'])
  15.              ->setPhone($record['phone']);
  16.         return $user;
  17.     }
  18.  
  19.     public function save(User $user)
  20.     {
  21.         $data = array(
  22.             'name'    => $user->getName(),
  23.             'email'   => $user->getEmail(),
  24.             'address' => $user->getAddress(),
  25.             'phone'   => $user->getPhone()
  26.         );
  27.         $this->_dao->save($data);
  28.     }
  29. }

dao
Código PHP:
Ver original
  1. interface UserDao
  2. {
  3.     public function find($criteria);
  4.     public function findAll($criteria);
  5.     public function save($data);
  6. }
  7.  
  8. class UserDbDao implements UserDao
  9. {
  10.     protected $_conn;
  11.     public function __construct(PDO $conn)
  12.     {...}
  13. }
  14.  
  15. class UserXMLDao implements UserDao
  16. {
  17.     protected $_file;
  18.     public function __construct($pathToFile)
  19.     {...}
  20. }
  21.  
  22. class UserWebServiceDao implements UserDao
  23. {
  24.     protected $_endpoint;
  25.     public function __construct($endpoint)
  26.     {...}
  27. }

DI Container

Código PHP:
Ver original
  1. class Container
  2. {
  3.     protected $_config;
  4.  
  5.     public function __construct(array $config)
  6.     {...}
  7.  
  8.     public function makeUserMapper()
  9.     {
  10.         $conn   = new PDO($this->_config['pdo.dsn']);
  11.         $dao    = new UserDbDao($conn);
  12.         $mapper = new UserMapper($dao);
  13.         return $mapper;
  14.     }
  15. }

uso:

Código PHP:
Ver original
  1. $container = new Container();
  2. $mapper = $container->makeUserMapper();
  3. $user   = $mapper->findById(1);
  4.  
  5. $user->setName('Zend rulz!');
  6.  
  7. $mapper->save($user);

Pero esto no es mas que un ejemplo muy simple y no muestra la verdadera complejidad, te sugiero que investigues sobre Identity Map, Unit of Work, Virtual Proxy, Lazy initialization, Lazy Loading, Eager Loading y seguro me estoy dejando alguno, lo expuesto aquí no es mas que la punta de la madeja.

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