Okey, voy a poner mi ejemplo ...
Tengo mis carpetas así
Model
--datos
--------UsuarioMemory
--------UsuarioXML
--entities
--------Usuario
--interfaces
--------IUsuarioService
--UsuarioModel
Lo que e aplicado es la inyección de dependencia ... ya que mi aplicativo puede consumir ya sea de una base de datos, un XML, o de la memoria sin tener que cambiar su lógica de negocio, solo debe cambiar su repositorio, es decir la dependencia inyectada.
Las clases
model/Entities/Usuario
Código PHP:
Ver originalclass Usuario {
private $_id;
private $_nombre;
private $_apellido;
private $_dni;
public function get_id() { return $this->_id; }
public function get_nombre() { return $this->_nombre; }
public function get_apellido() { return $this->_apellido; }
public function get_dni() { return $this->_dni; }
public function set_id($x) { $this->_id = $x; }
public function set_nombre($x) { $this->_nombre = $x; }
public function set_apellido($x) { $this->_apellido = $x; }
public function set_dni($x) { $this->_dni = $x; }
}
model/Datos/UsuarioXML
Código PHP:
Ver original<?php
class UsuarioXML {
private $_sxe;
public function __construct(){
$this->_sxe = new SimpleXMLElement('usuario.xml', NULL, TRUE);
}
public function listar(){
foreach($this->_sxe as $u){
$usuario = new Usuario();
$usuario->set_id((int)$u->id);
$usuario->set_nombre((string)$u->nombre);
$usuario->set_apellido((string)$u->apellido);
$usuario->set_dni((string)$u->dni);
$usuarios[] = $usuario;
}
return $usuarios;
}
public function registrar(Usuario $usuario){
$u = $this->_sxe->addChild('usuario');
$u->addChild('id', $this->_sxe
->count() + 1); $u->addChild('nombre', $usuario->get_nombre());
$u->addChild('apellido', $usuario->get_apellido());
$u->addChild('dni', $usuario->get_dni());
$this->save();
}
public function actualizar(Usuario $usuario){
foreach($this->_sxe as $u){
if($u->id == $usuario->get_id()){
$u->nombre = $usuario->get_nombre();
$u->apellido = $usuario->get_apellido();
$u->dni = $usuario->get_dni();
break;
}
}
$this->save();
}
public function eliminar($id){
$i = 0;
foreach($this->_sxe as $k => $u){
if($u->id == $id){
$dom->parentNode->removeChild($dom);
break;
}
$i++;
}
$this->save();
}
public function obtener($id){
$usuario = new Usuario();
foreach($this->_sxe as $u){
if($u->id == $id){
$usuario->set_id((int)$u->id);
$usuario->set_nombre((string)$u->nombre);
$usuario->set_apellido((string)$u->apellido);
$usuario->set_dni((string)$u->dni);
break;
}
}
return $usuario;
}
private function save(){
$fo = fopen('usuario.xml','w'); fwrite($fo, $this->_sxe
->asXML()); }
}
model/interfaces/IUsuarioService
Código PHP:
Ver originalinterface IUsuarioService {
public function setInjection($rp);
public function listar();
public function registrar(Usuario $usuario);
public function actualizar(Usuario $usuario);
public function eliminar($id);
public function obtener($id);
}
model/UsuarioModel
Código PHP:
Ver originalclass UsuarioModel implements IUsuarioService {
private $_Repossitory;
public function setInjection($rp){
$this->_Repossitory = $rp;
}
public function listar(){
return $this->_Repossitory->listar();
}
public function registrar(Usuario $usuario){
$this->_Repossitory->registrar($usuario);
}
public function actualizar(Usuario $usuario){
$this->_Repossitory->actualizar($usuario);
}
public function eliminar($id){
$this->_Repossitory->eliminar($id);
}
public function obtener($id){
return $this->_Repossitory->obtener($id);
}
}
Y ahora lo implemento asi
Código PHP:
Ver original$um = new UsuarioModel();
$um->setInjection(new UsuarioXML());
$usuarios = $um->listar();
En caso que nuestro proyecto ya no requiera el uso de los XML, simplemente cambiar su repositorio a UsuarioDB, o UsuarioTXT, o UsuarioMemoria
Esta bien lo que planteo?