Ver Mensaje Individual
  #3 (permalink)  
Antiguo 10/02/2014, 16:03
Avatar de hhs
hhs
Colaborador
 
Fecha de Ingreso: junio-2013
Ubicación: México
Mensajes: 2.995
Antigüedad: 10 años, 10 meses
Puntos: 379
Respuesta: Conectar a la base de datos con clases

Cita:
Iniciado por mili_07 Ver Mensaje
Hola a todos!! Gracias por tomarse el tiempo de leer mi tema, Tengo un problema y es que investigando un poco encontré que no es bueno utilizar Singleton para la conexión a la base de datos, estoy haciendo un sistema de login de usuarios pero no sé como conectar la base de datos tengo la clase usuarios por un lado y por el otro tengo la clase de conexion a la base de datos, tengo esto en la clase de conexion;

Código PHP:
class ConectBD{
    
    public function 
__construct(){
        
        
$nbase 'mysql:dbname=testtransaction;host=127.0.0.1';
        
$user 'user';
        
$pass 'root';
    
        try {
            
$conex = new PDO($nbase$user$pass);
                
        }catch (
PDOException $e) {
            echo 
'Falló la conexión: ' $e->getMessage();
        }
    }
    

Y este método en la clase de usuarios;

Código PHP:
public function insertarDatosUser(){
            
                
$val1 $this->getNombre();
                
$val2 $this->getnombreUser();
                
$val3 $this->getContraseña();
                
$val4 $this->getEmail();
                
$val5 $this->getApellido();
                
                
                
//Acá tengo que hacer el script de inserción en la base de datos 
Son dos archivos diferentes uno classConexion.php y el otro classUsuarios.php.
Mi duda es como hago para llamar a la conexión en el método de la clase usuarios,
Agradezco si alguien me puede dar una mano.

Saludos!
Fuera de como estas intentando persistir tu clase Usuario, tu problema por el cual consultas se resuelve mediante algo que se llama inyección de dependencias en el articulo explica de forma general que es y como puedes usarla.

Cita:
para empezar , deberias crear la clase donde consultas los datos extendida a la conexion. con esto todas las propiedades y metodos de la clase "ConectDB" estarian heredadas por la nueva funcion.
Esta aproximación no es muy recomendable por que se esta violando de entrada el principio de sustitución de Liskov. y estas agregando acoplamiento entre las clases, ademas de que la asociación entre las clases es de clara dependencia.

Inyeccion usando el constructor
Código PHP:
Ver original
  1. class Usuario{
  2.     private $db;
  3.  
  4.     private $nombre;
  5.  
  6.     //mas propiedades
  7.  
  8.     public function __construct(ConectBD $db){
  9.         $this->db = $db;
  10.     }
  11.  
  12.     public function insert(){
  13.         $this->db->beginTransaction();
  14.         $this->db->exec("insert ...."); //insert a la base de datos
  15.         $this->db->commit();
  16.     }
  17.  
  18. }
  19.  
  20. class ConectBD{
  21.  
  22.     public function __construct(){
  23.  
  24.         $nbase = 'mysql:dbname=testtransaction;host=127.0.0.1';
  25.         $user = 'user';
  26.         $pass = 'root';
  27.  
  28.         try {
  29.             $conex = new PDO($nbase, $user, $pass);
  30.             return $conex;
  31.  
  32.         }catch (PDOException $e) {
  33.             echo 'Falló la conexión: ' . $e->getMessage();
  34.         }
  35.     }
  36.  
  37. }

Uso basado eb tu ejemplo:
Código PHP:
Ver original
  1. $con = new ConectBD();
  2. $usuario = new Usuario($con); //inyeccion
  3. $usuario->insert();

Haciendo uso de un contenedor de inyecciones (pimple)
Código PHP:
Ver original
  1. $container = new Pimple();
  2.  
  3. $container['db'] = function() {
  4.     $host = 'localhost';
  5.     $dbName = 'testtransaction';
  6.     $user = 'user';
  7.     $pass = 'root';
  8.  
  9.     return new \PDO("mysql:host={$host};dbname={$dbName}", $user, $pass);
  10. };
  11.  
  12. class Usuario{
  13.     private $db;
  14.  
  15.     private $nombre;
  16.  
  17.     //mas propiedades
  18.  
  19.     public function __construct(Pimple $container){
  20.         $this->db = $container['db'];
  21.     }
  22.  
  23.     public function insert(){
  24.         $this->db->beginTransaction();
  25.         $this->db->exec("insert ...."); //insert a la base de datos
  26.         $this->db->commit();
  27.     }
  28.  
  29. }
Uso
Código PHP:
Ver original
  1. $usuario = new Usuario($container); //inyeccion
  2. $usuario->insert();
Espero te sirva. Si omití algo o tengo algún error, aprecio sus opiniones sobre el tema
__________________
Saludos
About me
Laraveles
A class should have only one reason to change.