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 originalclass User
{
protected $_name;
protected $_email;
protected $_address;
protected $_phone;
/*getters && setters*/
}
mapper
Código PHP:
Ver originalclass UserMapper
{
protected $_dao;
public function __construct(UserDao $dao)
{...}
public function findById($id)
{
$record = $this->_dao->find((int)$id);
$user = new User();
$user->setName($record['name'])
->setEmail($record['email'])
->setAddress($record['address'])
->setPhone($record['phone']);
return $user;
}
public function save(User $user)
{
'name' => $user->getName(),
'email' => $user->getEmail(),
'address' => $user->getAddress(),
'phone' => $user->getPhone()
);
$this->_dao->save($data);
}
}
dao
Código PHP:
Ver originalinterface UserDao
{
public function find($criteria);
public function findAll($criteria);
public function save($data);
}
class UserDbDao implements UserDao
{
protected $_conn;
public function __construct(PDO $conn)
{...}
}
class UserXMLDao implements UserDao
{
protected $_file;
public function __construct($pathToFile)
{...}
}
class UserWebServiceDao implements UserDao
{
protected $_endpoint;
public function __construct($endpoint)
{...}
}
DI Container
Código PHP:
Ver originalclass Container
{
protected $_config;
public function __construct
(array $config) {...}
public function makeUserMapper()
{
$conn = new PDO($this->_config['pdo.dsn']);
$dao = new UserDbDao($conn);
$mapper = new UserMapper($dao);
return $mapper;
}
}
uso:
Código PHP:
Ver original$container = new Container();
$mapper = $container->makeUserMapper();
$user = $mapper->findById(1);
$user->setName('Zend rulz!');
$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.