Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

duda: objetos de negocio y conexión a la base de datos

Estas en el tema de duda: objetos de negocio y conexión a la base de datos en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola buenas de nuevo, Quisiera saber cual es la mejor manera de implementar la conexión en nuestros objetos de negocio.. por ejemplo, el objeto Noticia.. ...
  #1 (permalink)  
Antiguo 06/04/2011, 09:19
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
duda: objetos de negocio y conexión a la base de datos

Hola buenas de nuevo,

Quisiera saber cual es la mejor manera de implementar la conexión en nuestros objetos de negocio.. por ejemplo, el objeto Noticia..

que haría? un __construct($conId), o __construct(Config $config)?

Y después.. cada vez que lo creo.. tendría que pasar el parámetro... no me gusta nada de nada..

Un saludo y gracias!
  #2 (permalink)  
Antiguo 06/04/2011, 09:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: duda: objetos de negocio y conexión a la base de datos

Lee sobre Dependency Injection, sirve precisamente para lo que quieres hacer.

Saludos.
  #3 (permalink)  
Antiguo 06/04/2011, 09:38
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: duda: objetos de negocio y conexión a la base de datos

Muchas gracias!

Una duda... respecto a lo de añadir un fichero .ini para los datos de la conexión a la base de datos... es seguro? ( ya se que el fichero se colocaría fuera de la ruta pública.. pero como nunca lo he usado.. )

Un saludo!
  #4 (permalink)  
Antiguo 06/04/2011, 09:45
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: duda: objetos de negocio y conexión a la base de datos

Una pregunta GatorV... pero el hacerlo de esa manera no vuelve dependiente al objeto noticia del objeto conexión?

Porque se debe hacer un require/include para que lo reconozca no? Osea si no existe el objeto conexión que debería pasar con el objeto noticia?

Gracias :)
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #5 (permalink)  
Antiguo 06/04/2011, 09:48
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: duda: objetos de negocio y conexión a la base de datos

Supongo que debería tirarte una excepción de falta de componente conexión...

Es como un carro, necesita llantas para caminar si no las trae seguro no funcionara tu vehiculo

:D Bueno por algo se llama Inyección de "DEPENDENCIAS".
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #6 (permalink)  
Antiguo 06/04/2011, 10:00
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: duda: objetos de negocio y conexión a la base de datos

_ssx, cómo vas?

Pero según tengo entendido, uno podría hacer para evitar esa dependencia, crear otra clase que instancie las otras dos (conexión y noticia) y que sea esa nueva clase la que haga uso de las dos, sin ninguna dependencia entre ellas.

Eso que digo es a manera de diseño, no sé que tan acertado esté.

Gracias!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #7 (permalink)  
Antiguo 06/04/2011, 10:10
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: duda: objetos de negocio y conexión a la base de datos

Claro para eso es precisamente Dependendy Injection, mira este ejemplo:
Código PHP:
Ver original
  1. class Noticias {
  2.     private $_db;
  3.    
  4.     public function __construct() {}
  5.    
  6.     public function setDb(DBInterface $db) {
  7.         $this->_db = $db;
  8.     }
  9. }

Luego desde donde unes las clases:
Código PHP:
Ver original
  1. $Db = new DB(/** Datos **/);
  2. $Noticias = new Noticias();
  3. $Noticias->setDb($Db);

Así como dice _ssx la clase noticias requiere de una db para trabajar, pero a la hora de usar una interfaz/clase estamos desacoplando que tipo de db va a usar.

En el ejemplo del auto / llantas, usando DI es decirle este auto puede usar cualquier tipo de llanta (necesita llantas para caminar) pero puede ser llantas para nieve, llantas de carreras, etc.

Saludos.
  #8 (permalink)  
Antiguo 06/04/2011, 10:27
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: duda: objetos de negocio y conexión a la base de datos

Mmmm ya entiendo el concepto.

Una pregunta más, en ese caso, que la clase noticias necesitará la clase Db, es mejor usar interface o class? Cuál serían sus diferencias?

Gracias!
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #9 (permalink)  
Antiguo 06/04/2011, 10:29
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: duda: objetos de negocio y conexión a la base de datos

Una interface debido a que puedes cambiar de motor de persistencia en el momento que desees, ya sea una DB o un XML o un Archivo, etc etc...

Al final del dia vas a utilizar una clase, sin embargo la interface se convierte en el "contrato" que debe de cumplir la clase conexión para poder funcionar.
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #10 (permalink)  
Antiguo 06/04/2011, 10:30
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: duda: objetos de negocio y conexión a la base de datos

Perfecto! gracias a los dos por los datos :D

__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #11 (permalink)  
Antiguo 06/04/2011, 11:39
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: duda: objetos de negocio y conexión a la base de datos

Cita:
Iniciado por _ssx Ver Mensaje
Una interface debido a que puedes cambiar de motor de persistencia en el momento que desees, ya sea una DB o un XML o un Archivo, etc etc...

Al final del dia vas a utilizar una clase, sin embargo la interface se convierte en el "contrato" que debe de cumplir la clase conexión para poder funcionar.
Yo me he perdido en este punto... en que momento se necesita una interfaz??

Un saludo!
  #12 (permalink)  
Antiguo 06/04/2011, 11:45
Avatar de _ssx  
Fecha de Ingreso: mayo-2003
Ubicación: mX
Mensajes: 683
Antigüedad: 20 años, 11 meses
Puntos: 60
Respuesta: duda: objetos de negocio y conexión a la base de datos

Cita:
Iniciado por miktrv Ver Mensaje
Yo me he perdido en este punto... en que momento se necesita una interfaz??

Un saludo!
En el momento que quieres separar tu motor de persistencia para tener Flexibilidad

Código PHP:
interface Persistencia
{
    public function 
conectar();
    public function 
desconectar();
    public function 
ejecutar(SQL $sql);
}

class 
SQLServer implements Persistencia{

}

class 
ORACLE implements Persistencia{

}

class 
MySQL implements Persistencia{

}

class 
Noticia{
        private 
$_db;
        public function 
setDb(Persistencia $db){
        
$this->_db $db;
        }
        public function 
getNota(){
        
$this->_db->ejecutar('SELECT BLA BLA BLA');
        }

Entonces ya tu noticia puedes enviarle cualquier tipo de "persistencia". por que estas usando una interfaz "comun" debido a que todas las clases que implementan Persistencia tendrán los mismos metodos.

Código PHP:
$nota = new Noticia();
$nota->setDb(new Oracle());
$nota->getNota(); 
Código PHP:
$nota = new Noticia();
$nota->setDb(new Mysql());
$nota->getNota(); 
Código PHP:
$nota = new Noticia();
$nota->setDb(new SQLServer());
$nota->getNota(); 
Si observas getNota de la noticia, NO necesita saber con que base de datos esta tratando ;) eso lo hace el lenguaje automaticamente con polimorfismo indirecto.
__________________
Escribe tu código de forma que refleje, y saque a relucir,lo mejor de tu carácter personal
www.oscararzola.com/blog
Principios de un programador
  #13 (permalink)  
Antiguo 06/04/2011, 14:38
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: duda: objetos de negocio y conexión a la base de datos

Cita:
Iniciado por _ssx Ver Mensaje
En el momento que quieres separar tu motor de persistencia para tener Flexibilidad

Código PHP:
interface Persistencia
{
    public function 
conectar();
    public function 
desconectar();
    public function 
ejecutar(SQL $sql);
}

class 
SQLServer implements Persistencia{

}

class 
ORACLE implements Persistencia{

}

class 
MySQL implements Persistencia{

}

class 
Noticia{
        private 
$_db;
        public function 
setDb(Persistencia $db){
        
$this->_db $db;
        }
        public function 
getNota(){
        
$this->_db->ejecutar('SELECT BLA BLA BLA');
        }

Entonces ya tu noticia puedes enviarle cualquier tipo de "persistencia". por que estas usando una interfaz "comun" debido a que todas las clases que implementan Persistencia tendrán los mismos metodos.

Código PHP:
$nota = new Noticia();
$nota->setDb(new Oracle());
$nota->getNota(); 
Código PHP:
$nota = new Noticia();
$nota->setDb(new Mysql());
$nota->getNota(); 
Código PHP:
$nota = new Noticia();
$nota->setDb(new SQLServer());
$nota->getNota(); 
Si observas getNota de la noticia, NO necesita saber con que base de datos esta tratando ;) eso lo hace el lenguaje automaticamente con polimorfismo indirecto.
Perfecto,

Sabía para que se usa la interfaz, como un contrato y para asegurarnos de que cumple unos requisitos.. pero no la he implementado en mi clase que trabaja con la base de datos.. jeje ahora ya lo se.. mi idea era usar la clase con el mismo nombre y con funcionamiento distinto, de esa manera sólo tendría que cambiar el código de la clase.. aunque con el uso de la interfaz también puedo.

Un saludo!!
  #14 (permalink)  
Antiguo 06/04/2011, 14:45
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: duda: objetos de negocio y conexión a la base de datos

Que bueno se puso el thread, lastima que llego tarde, igual voy a tratar de complementar algo, tomando de base el ejemplo de _ssx(excelentes tus intervenciones ,) y lo que comenta GatorV(Dependency Injection)

DAO's
Código PHP:
Ver original
  1. interface IDao
  2. {
  3.     public function find($criteria);
  4.     public function findAll($criteria);
  5.     public function save($data);
  6. }
  7.  
  8. class NewsDbDao implements IDao
  9. {...}
  10.  
  11. class NewsXMLDao implements IDao
  12. {...}
  13.  
  14. class NewsWSDao implements IDao
  15. {...}
  16.  
  17. class News
  18. {
  19.     ...
  20.     public function __construct(IDao $dao)
  21.     {...}
  22.     ...
  23. }

El injector/assembler a través de una de sus formas mas típicas, un container(muy básico), garantizando las dependencias.

Código PHP:
Ver original
  1. class Container
  2. {
  3.     protected $_params = array();
  4.     protected static $_shared = array();
  5.  
  6.     public function __construct(array $params)
  7.     {
  8.         $this->_params = $params
  9.     }
  10.  
  11.     public function getNewWithDbDao()
  12.     {
  13.         $pdo = new PDO($this->_params['news.dbdao.dsn']);
  14.         $dao = new NewsDbDao($pdo);
  15.         return new News($dao);
  16.     }
  17.  
  18.     public function getNewWithXMLDao()
  19.     {
  20.         $file = new SPLFileinfo($this->_params['news.xmldao.filename']);
  21.         $dao  = new NewsXMLDao($file);
  22.         return new News($dao);
  23.     }
  24.  
  25.     public function getNewWithWSDao()
  26.     {
  27.         $dao = new NewsWBDao($this->_params['news.wbdao.endpoint']);
  28.         return new News($dao);
  29.     }
  30.  
  31. }

y el modo de empleo seria:

Código PHP:
Ver original
  1. $params = array(/***/);
  2. $container = new Container($params);
  3.  
  4. $dbNew  = $container->getNewWithDbDao();
  5. $dbNew->find($criteria);
  6.  
  7. $xmlNew = $container->getNewWithXMLDao();
  8. $xmlNew->findAll($criteria);
  9.  
  10. $wsNew  = $container->getNewWithWSDao();
  11. $wsNew->save($data);

Nota: el ejemplo de _ssx no solo muestra el beneficio de las interfaces, es un claro ejemplo de porque hay que utilizar PDO.

Saludos
__________________
http://es.phptherightway.com/
thats us riders :)
  #15 (permalink)  
Antiguo 06/04/2011, 14:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: duda: objetos de negocio y conexión a la base de datos

Muy buenos los comentarios, y muestran exactamente los beneficios/poder de usar POO, que no es solo usar clases, si no el poliformismo.
  #16 (permalink)  
Antiguo 06/04/2011, 15:23
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: duda: objetos de negocio y conexión a la base de datos

Interesante tema

Una sola cosa, ¿en la clase News hay que también crear los métodos find, findAll y save?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #17 (permalink)  
Antiguo 06/04/2011, 16:52
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: duda: objetos de negocio y conexión a la base de datos

Cita:
Iniciado por abimaelrc Ver Mensaje
Interesante tema

Una sola cosa, ¿en la clase News hay que también crear los métodos find, findAll y save?
Si, aunque habría un Layer Supertype y se podría hacer uso de la "magia" para recaer sobre el DAO, con algo de refactoring quedaría así:

Código PHP:
Ver original
  1. abstract class DomainObject implements ArrayAccess
  2. {
  3.     public function __construct(IDao $dao)
  4.     {/***/}
  5.    
  6.     public function __call($method, $args)
  7.     {/***/}
  8. }
  9.  
  10. class News Extends DomainObject
  11. {}

no es mas que un ejemplo y la idea en mi post era mas que nada ejemplificar lo que menciono GatorV(DI), algo muy útil, yo soy partidario de DataMapper + Repository (en fin Doctrine 2).

Saludos.
__________________
http://es.phptherightway.com/
thats us riders :)
  #18 (permalink)  
Antiguo 07/04/2011, 00:48
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: duda: objetos de negocio y conexión a la base de datos

Cita:
Iniciado por masterpuppet Ver Mensaje
Si, aunque habría un Layer Supertype y se podría hacer uso de la "magia" para recaer sobre el DAO, con algo de refactoring quedaría así:

Código PHP:
Ver original
  1. abstract class DomainObject implements ArrayAccess
  2. {
  3.     public function __construct(IDao $dao)
  4.     {/***/}
  5.    
  6.     public function __call($method, $args)
  7.     {/***/}
  8. }
  9.  
  10. class News Extends DomainObject
  11. {}

no es mas que un ejemplo y la idea en mi post era mas que nada ejemplificar lo que menciono GatorV(DI), algo muy útil, yo soy partidario de DataMapper + Repository (en fin Doctrine 2).

Saludos.
Hola buenas,

Me vuelvo a perder...

Estaría bien que las explicaciones fueran un poco más "accesibles" a todos.. jeje

Un saludo!
  #19 (permalink)  
Antiguo 07/04/2011, 08:22
Avatar de Carxl
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: Bogotá
Mensajes: 2.993
Antigüedad: 17 años, 8 meses
Puntos: 70
Respuesta: duda: objetos de negocio y conexión a la base de datos

Que tema tan chimba!!! Muy muy bueno!!

Saludos.
__________________
Hay 10 tipos de personas, los que entienden binario y los que no. (Anónimo)
www.programandoweb.com
  #20 (permalink)  
Antiguo 07/04/2011, 09:53
Avatar de juaniquillo
Colaborador
 
Fecha de Ingreso: noviembre-2005
Ubicación: San Juan, Puerto Rico
Mensajes: 5.745
Antigüedad: 18 años, 5 meses
Puntos: 281
Respuesta: duda: objetos de negocio y conexión a la base de datos

Cita:
Iniciado por Carxl Ver Mensaje
Que tema tan chimba!!! Muy muy bueno!!

Saludos.
Estoy igual que Carxl. Muy buenos ejemplos de poliformismo. Voy a estar siguiendo este tema de cerca. Saludos.
__________________
Por fin.. tengo algo parecido a un blog
Y por lo visto ya estoy escribiendo...
  #21 (permalink)  
Antiguo 07/04/2011, 14:36
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: duda: objetos de negocio y conexión a la base de datos

Cita:
Iniciado por miktrv Ver Mensaje
Hola buenas,

Me vuelvo a perder...

Estaría bien que las explicaciones fueran un poco más "accesibles" a todos.. jeje

Un saludo!
Las disculpas del caso miktrv, que parte no te ha quedado clara ?.

Nota: hay hambre de OOP & Patterns , buen síntoma.
__________________
http://es.phptherightway.com/
thats us riders :)
  #22 (permalink)  
Antiguo 07/04/2011, 14:42
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 15 años, 9 meses
Puntos: 165
Respuesta: duda: objetos de negocio y conexión a la base de datos

Hola buenas,

Gracias.

Pues lo de los data objects..

Un saludo!
  #23 (permalink)  
Antiguo 08/04/2011, 10:09
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: duda: objetos de negocio y conexión a la base de datos

Ahora el que no te sigue soy yo miktrv , esta parte es la que no te queda clara ?

Cita:
...se podría hacer uso de la "magia" para recaer sobre el DAO...
__________________
http://es.phptherightway.com/
thats us riders :)

Etiquetas: negocio, objetos
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

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 18:28.