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

PHP OO Conexion PDO con patron Registro

Estas en el tema de Conexion PDO con patron Registro en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Buenas amigos, he leído en el foro que la conexion a la base de datos es mejor hacerla con el patron Registry que con Singleton. ...
  #1 (permalink)  
Antiguo 16/12/2010, 09:35
 
Fecha de Ingreso: junio-2009
Mensajes: 156
Antigüedad: 15 años, 6 meses
Puntos: 3
Conexion PDO con patron Registro

Buenas amigos, he leído en el foro que la conexion a la base de datos es mejor hacerla con el patron Registry que con Singleton.
Acabo de terminar una conexion que es con pdo y utiliza una clase que es un patron registro, que obviamente "registra" la conexion, para poder utilizarla posteriormente en cualquier otra clase, aqui les dejo las clases y me gustaría que me corrijieran a ver si está bien implementado el uso del patron, o está faltando algo (mas alla de que funcione lo que me interesa es el modelado en general y el uso del patron).

//clase que hace la conexion a pdo
Código PHP:
Ver original
  1. class conectarpdo{
  2.    
  3.  
  4.     private  $base;
  5.     private  $usuario;
  6.     private  $pass;
  7.  
  8.     function __construct(){
  9.  
  10.  
  11.         $this->base="mibase";
  12.         $this->usuario="miuser";
  13.         $this->pass="mipassword";
  14.  
  15.     }
  16.  
  17.     public function conectar(){
  18.  
  19.         $conectar=new PDO('mysql:host=localhost;dbname='.$this->base,$this->usuario,$this->pass);
  20.                  return $conectar;
  21.  
  22.     }
  23. }


// la interface del patron registry y su implementacion en la clase a utilizar
Código PHP:
Ver original
  1. interface patron_registro{
  2.  
  3. public function agregar();
  4. public function remover();
  5. public function obtener();
  6. public function existe();
  7.  
  8. }
  9.  
  10. class registro_conexion implements patron_registro {
  11.  
  12.     private $registro;
  13.  
  14.     public function  agregar() {
  15.        if(!isset($this->registro))
  16.        {
  17.  
  18.          $conn = new conectarpdo();
  19.          $valor_conexion = $conn->conectar();
  20.          $this->registro = $valor_conexion;
  21.        }
  22.     }
  23.  
  24.     public function  remover() {
  25.         if(!empty($this->registro))
  26.          {
  27.            unset($this->registro);
  28.          }
  29.     }
  30.  
  31.     public function  obtener() {
  32.  
  33.        if(!empty($this->registro))
  34.          {
  35.            return $this->registro;
  36.          }
  37.     }
  38.  
  39.  
  40.     public function  existe() {
  41.         if(!empty($this->registro))
  42.         {
  43.           return true;
  44.         }
  45.         else{
  46.           return false;
  47.         }
  48.    }
  49.  
  50.  
  51.  
  52. }

Su utilización:
Código PHP:
Ver original
  1. //dentro de un metodo de cualquier clase
  2.  
  3. $crearconn = new registro_conexion();
  4. $existe = $crearconn->existe();
  5.  
  6. if(TRUE == $existe){
  7.     $conectar = $crearconn->obtener();
  8. }
  9. else{
  10.     $crearconn->agregar();
  11.     $conectar = $crearconn->obtener();
  12. }
  13.  
  14. //en $conectar tengo una conexion PDO y puedo utilizarla por ej. para hacer un select.
  15. $consulta=$conectar->prepare('select * from paraobj where id =:id');
  16. $consulta->bindParam(':id',$this->dato);
  17.  
  18. $consulta->execute();
Bueno, el que pueda echar una miradita a ver si esta bien implementado esto le agradezco.
  #2 (permalink)  
Antiguo 16/12/2010, 10:29
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Conexion PDO con patron Registro

No, el patrón Registry, no se implementa así, te recomiendo veas ejemplos en internet, algo muy simple sería asi:
Código PHP:
Ver original
  1. class Registry {
  2.     private $_cache;
  3.    
  4.     public function __construct() {
  5.         $this->_cache = array();
  6.     }
  7.     public function set($key, &$item) {
  8.         $this->_cache[$key] = &$item;
  9.     }
  10.     public function get($key) {
  11.         return $this->_cache[$key];
  12.     }
  13.     public function has($key) {
  14.         return ($this->get($key) !== null);
  15.     }
  16. }

Y lo usas como:
Código PHP:
Ver original
  1. $Registry = new Registry();
  2. if (!$Registry->has('conexion')) {
  3.       $Registry->set('conexion', $conexion);
  4. }
  5. // Mas adelante
  6. $conexion = $Registry->get('conexion');

Saludos.

Última edición por GatorV; 16/12/2010 a las 14:54
  #3 (permalink)  
Antiguo 16/12/2010, 14:27
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: Conexion PDO con patron Registro

en la linea
Código PHP:
Ver original
  1. return ($this->getEntry($key) !== null);

es error de tipeo.. o me perdí en alguna parte ?

Código PHP:
Ver original
  1. return ($this->get($key) !== null);


saludos
tnks por el ejemplo !
__________________
More about me...
~ @rhyudek1
~ Github
  #4 (permalink)  
Antiguo 16/12/2010, 14:54
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 6 meses
Puntos: 2135
Respuesta: Conexion PDO con patron Registro

Cierto tienes toda la razón lo programé de rápido jeje
  #5 (permalink)  
Antiguo 16/12/2010, 15:48
 
Fecha de Ingreso: junio-2009
Mensajes: 156
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Conexion PDO con patron Registro

Hola, gracias por la corrección.
Por lo que entiendo en tu ejemplo, la clase Registro "debe" recibir la conexion a la db por parametro y no como lo hice yo tipo "asociación" (por referirnos a un supuesto diagrama de clases), o sea creando el objeto dentro del metodo "agregar".

Estoy en lo cierto?

Otra cosa, en tu ejemplo en la linea 7, en el metodo "set" ingresas un parametro por referencia "&", tenía entendido que en php5 todos los parametros pasan automaticamente por valor... si no estoy en lo cierto que quiere decir el "&".
gracias.
  #6 (permalink)  
Antiguo 16/12/2010, 16:30
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: Conexion PDO con patron Registro

el echo de usar el registry en este tipo de clases para el manejo de base de datos es que puedas instanciar diferentes manejadores en una misma pagina cuando sea necesario y el echo de no tener que instanciar varias veces la clase para realizar las consultas, yo haciendo consultas en este foro llegue a realizar una clase extendiendo de PDO si gustas en visualizarla saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #7 (permalink)  
Antiguo 16/12/2010, 19:11
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años, 6 meses
Puntos: 2
Respuesta: Conexion PDO con patron Registro

Tambien puedes hacer uso de la clase SplObjectStorage de SPL( standar php library) que es un registry. no implementas y vas con el standard

http://www.php.net/manual/en/class.splobjectstorage.php
__________________
Saludos!
Mty-NL..
  #8 (permalink)  
Antiguo 16/12/2010, 19:18
Avatar de masterpuppet
Software Craftsman
 
Fecha de Ingreso: enero-2008
Ubicación: Montevideo, Uruguay
Mensajes: 3.550
Antigüedad: 16 años, 10 meses
Puntos: 845
Respuesta: Conexion PDO con patron Registro

Cita:
Iniciado por HerSAn Ver Mensaje
Tambien puedes hacer uso de la clase SplObjectStorage de SPL( standar php library) que es un registry. no implementas y vas con el standard

http://www.php.net/manual/en/class.splobjectstorage.php
No creo que SplObjectStorage sea el mas adecuado para el trabajo, utiliza como clave objetos, preferible hacer como Zend y utilizar ArrayObject.
  #9 (permalink)  
Antiguo 16/12/2010, 21:45
 
Fecha de Ingreso: mayo-2005
Mensajes: 201
Antigüedad: 19 años, 6 meses
Puntos: 2
Respuesta: Conexion PDO con patron Registro

Cita:
Iniciado por masterpuppet Ver Mensaje
No creo que SplObjectStorage sea el mas adecuado para el trabajo, utiliza como clave objetos, preferible hacer como Zend y utilizar ArrayObject.
Si tienes razon es mas bien un mapper pero bien puede usarse para hacer el registry pero se tiene que trabajar mas, mejor usar el componente de ZF lastima me gustaba la idea del SplObjectStorage. pero bueno se puede utlizar de otras formas igual con el oberver o composite. cosa de verlo
__________________
Saludos!
Mty-NL..
  #10 (permalink)  
Antiguo 17/12/2010, 07:39
 
Fecha de Ingreso: junio-2009
Mensajes: 156
Antigüedad: 15 años, 6 meses
Puntos: 3
Respuesta: Conexion PDO con patron Registro

Bueno he hecho las correcciones, ademas lo he problado y funciona perfectamente.
Código PHP:
Ver original
  1. //clase que hace la conexion
  2.  
  3. class conectarpdo{
  4.  
  5.  
  6.     private  $base;
  7.     private  $usuario;
  8.     private  $pass;
  9.  
  10.     function __construct(){
  11.  
  12.  
  13.         $this->base="mibase";
  14.         $this->usuario="myuserl";
  15.         $this->pass="mypassword";
  16.  
  17.     }
  18.  
  19.     public function conectar(){
  20.  
  21.         $conectar=new PDO('mysql:host=localhost;dbname='.$this->base,$this->usuario,$this->pass);
  22.                  return $conectar;
  23.  
  24.     }
  25. }

La clase Registry con algun cambio en el metodo has (me gusta mas asi)
Código PHP:
Ver original
  1. class Registry {
  2.     private  $_cache;
  3.  
  4.     public function __construct() {
  5.         $this->_cache = array();
  6.     }
  7.     public function set($key, $item) {
  8.         $this->_cache[$key] = $item;
  9.     }
  10.     public function get($key) {
  11.         return $this->_cache[$key];
  12.     }
  13.     public function has($key) {
  14.         if(!empty($this->_cache[$key]))
  15.         {
  16.           return true;
  17.         }
  18.         else{
  19.           return false;
  20.         }
  21.     }
  22. }

Asi es su uso:
Código PHP:
Ver original
  1. $uno = new conectarpdo();
  2. $conexion = $uno->conectar();
  3.  
  4.  
  5. $Registry = new Registry();
  6. if (!$Registry->has('conexion')) {
  7.       $Registry->set('conexion', $conexion);
  8. }
  9. // Mas adelante
  10. $conexion = $Registry->get('conexion');
  11.  
  12. $datito = 27;
  13. //en $conexion tengo una conexion PDO y puedo utilizarla por ej. para hacer un select.
  14. $consulta=$conexion->prepare('select * from administradores where id =:id');
  15. $consulta->bindParam(':id',$datito);
  16.  
  17. $consulta->execute();
  18. while($fila=$consulta->fetch()){
  19.  
  20. etc. etc.
  21.  
  22. //en la misma pagina otra
  23. $lamismaconexion = $Registry->get('conexion');
  24.  
  25.  
  26. //en $lamismaconexion tengo ahora la conexion PDO y puedo utilizarla por ej. para hacer otro select.
  27.  
  28. $consulta=$lamismaconexion->prepare( etc. etc.
Bueno asi ha quedado, si ven algo a corregir por favor avisar.
Saludos.
  #11 (permalink)  
Antiguo 17/12/2010, 08:13
 
Fecha de Ingreso: diciembre-2009
Ubicación: Misiones
Mensajes: 867
Antigüedad: 15 años
Puntos: 65
Respuesta: Conexion PDO con patron Registro

¿en vez de preguntar si no existe entonces setear no es mejor en el método set verificar si existe?

o antes de crear la conexión verificar si existe entonces si existe no crear la conexión?
  #12 (permalink)  
Antiguo 17/12/2010, 08:31
Colaborador
 
Fecha de Ingreso: octubre-2009
Ubicación: Tokyo - Japan !
Mensajes: 3.867
Antigüedad: 15 años, 1 mes
Puntos: 334
Respuesta: Conexion PDO con patron Registro

 
 
Código PHP:
Ver original
  1. $Registry = new Registry();
  2. if (!$Registry->has('conexion')) {
  3.       $uno = new conectarpdo();
  4.       $conexion = $uno->conectar();
  5.       $Registry->set('conexion', $conexion);
  6. }

eso debería ir dentro para q tuviera sentido o me equivoco ?

saludos.
__________________
More about me...
~ @rhyudek1
~ Github
  #13 (permalink)  
Antiguo 17/12/2010, 16:40
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 7 meses
Puntos: 461
Respuesta: Conexion PDO con patron Registro

pues pienso que pudieras aprovechar un poco mas de las bondades que ofrece la POO, utilizando la herencia extendiendo tu clase conectarpdo directamente de PDO, ademas de en el constructor directamente instanciar a PDO, de esta manera te ahorrarias el estar colocando un metodo extra solo para instanciar a pdo utilizando tu codigo pudieramos hacer algo como esto:


Código PHP:
Ver original
  1. //clase que hace la conexion
  2.  
  3. class conectarpdo extends PDO
  4. {
  5.     private  $base;
  6.     private  $usuario;
  7.     private  $pass;
  8.  
  9.     function __construct()
  10.    {
  11.          $this->base="mibase";
  12.         $this->usuario="myuserl";
  13.         $this->pass="mypassword";
  14.         parent::__construct('mysql:host=localhost;dbname='.$this->base,$this->usuario,$this->pass);
  15.    }
  16. }
de esta manera solo con instanciar la clase estarias creando ya la instancia de PDO ya que la misma extiende de esta, saludos espero te sirva
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way

Etiquetas: conexion, patron, pdo, registro
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




La zona horaria es GMT -6. Ahora son las 02:15.