Ver Mensaje Individual
  #7 (permalink)  
Antiguo 08/11/2012, 10:44
Avatar de HiToGoRoShi
HiToGoRoShi
 
Fecha de Ingreso: abril-2008
Mensajes: 849
Antigüedad: 16 años, 9 meses
Puntos: 31
Respuesta: Patron IoC e inyeccion de dependencia

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 original
  1. class Usuario {
  2.     private $_id;
  3.     private $_nombre;
  4.     private $_apellido;
  5.     private $_dni;
  6.    
  7.     public function get_id() { return $this->_id; }
  8.     public function get_nombre() { return $this->_nombre; }
  9.     public function get_apellido() { return $this->_apellido; }
  10.     public function get_dni() { return $this->_dni; }
  11.     public function set_id($x) { $this->_id = $x; }
  12.     public function set_nombre($x) { $this->_nombre = $x; }
  13.     public function set_apellido($x) { $this->_apellido = $x; }
  14.     public function set_dni($x) { $this->_dni = $x; }
  15. }

model/Datos/UsuarioXML
Código PHP:
Ver original
  1. <?php
  2. class UsuarioXML {
  3.    
  4.     private $_sxe;
  5.    
  6.     public function __construct(){
  7.         $this->_sxe = new SimpleXMLElement('usuario.xml', NULL, TRUE);
  8.     }
  9.     public function listar(){
  10.         $usuarios = array();
  11.         foreach($this->_sxe as $u){
  12.             $usuario = new Usuario();
  13.            
  14.             $usuario->set_id((int)$u->id);
  15.             $usuario->set_nombre((string)$u->nombre);
  16.             $usuario->set_apellido((string)$u->apellido);
  17.             $usuario->set_dni((string)$u->dni);
  18.            
  19.             $usuarios[] = $usuario;
  20.         }
  21.        
  22.         return $usuarios;
  23.     }
  24.     public function registrar(Usuario $usuario){
  25.         $u = $this->_sxe->addChild('usuario');
  26.        
  27.         $u->addChild('id', $this->_sxe->count() + 1);
  28.         $u->addChild('nombre', $usuario->get_nombre());
  29.         $u->addChild('apellido', $usuario->get_apellido());
  30.         $u->addChild('dni', $usuario->get_dni());
  31.        
  32.         $this->save();
  33.     }
  34.     public function actualizar(Usuario $usuario){
  35.         foreach($this->_sxe as $u){
  36.             if($u->id == $usuario->get_id()){
  37.                 $u->nombre   = $usuario->get_nombre();
  38.                 $u->apellido = $usuario->get_apellido();
  39.                 $u->dni      = $usuario->get_dni();
  40.                 break;
  41.             }
  42.         }
  43.        
  44.         $this->save();
  45.     }
  46.     public function eliminar($id){
  47.         $i = 0;
  48.         foreach($this->_sxe as $k => $u){
  49.             if($u->id == $id){
  50.                 $dom =dom_import_simplexml($u);
  51.                 $dom->parentNode->removeChild($dom);
  52.                 break;
  53.             }
  54.             $i++;
  55.         }
  56.         $this->save();
  57.     }
  58.     public function obtener($id){
  59.         $usuario = new Usuario();
  60.         foreach($this->_sxe as $u){
  61.             if($u->id == $id){     
  62.                 $usuario->set_id((int)$u->id);
  63.                 $usuario->set_nombre((string)$u->nombre);
  64.                 $usuario->set_apellido((string)$u->apellido);
  65.                 $usuario->set_dni((string)$u->dni);
  66.                 break;
  67.             }
  68.         }
  69.        
  70.         return $usuario;
  71.     }
  72.     private function save(){
  73.         $fo = fopen('usuario.xml','w');
  74.         fwrite($fo, $this->_sxe->asXML());
  75.         fclose($fo);
  76.     }
  77. }

model/interfaces/IUsuarioService
Código PHP:
Ver original
  1. interface IUsuarioService {
  2.     public function setInjection($rp);
  3.    
  4.     public function listar();
  5.     public function registrar(Usuario $usuario);
  6.     public function actualizar(Usuario $usuario);
  7.     public function eliminar($id);
  8.     public function obtener($id);
  9. }


model/UsuarioModel
Código PHP:
Ver original
  1. class UsuarioModel implements IUsuarioService {
  2.  
  3.     private $_Repossitory;
  4.  
  5.     public function setInjection($rp){
  6.         $this->_Repossitory = $rp;
  7.     }
  8.  
  9.     public function listar(){
  10.         return $this->_Repossitory->listar();
  11.     }
  12.     public function registrar(Usuario $usuario){
  13.         $this->_Repossitory->registrar($usuario);
  14.     }
  15.     public function actualizar(Usuario $usuario){
  16.         $this->_Repossitory->actualizar($usuario);
  17.     }
  18.     public function eliminar($id){
  19.         $this->_Repossitory->eliminar($id);
  20.     }
  21.     public function obtener($id){
  22.         return $this->_Repossitory->obtener($id);
  23.     }
  24.  
  25. }

Y ahora lo implemento asi
Código PHP:
Ver original
  1. $um = new UsuarioModel();
  2. $um->setInjection(new UsuarioXML());
  3.  
  4. $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?