Ver Mensaje Individual
  #43 (permalink)  
Antiguo 11/11/2010, 17:38
Avatar de carlos_belisario
carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 14 años, 8 meses
Puntos: 461
Respuesta: lo estoy haciendo bien??

bueno dejo el codigo de la clase funcionando para que le sea de utilidad a cualquier otra persona si se fija en almigo atrianaster dejo los archivos para establecer la conexion aca:

Cita:
Iniciado por atrianaster Ver Mensaje
Bueno te recomiendo que no utilices el Patrón Singleton en tu clase Config. Ya que si estas utilizando PDO que es una capa de abstracción de bases de datos que te permite conectarte a varias bases de datos, cuando utilizas Singleton en esta clase te restringe a que solo puedas tener una sola instancia, es decir no podrás tener configuraciones distintas de distintas bases de datos en un mismo script archivo php. Suponiendo que quieres utilizar Mysql y PostgreSQL a la vez.

Por otro lado como ya debes sabes el atributo dns de PDO el string de configuración cambia para cada gestor de bases de datos y en tu clase Conexion no te va a servir cuando quieras utilizar por ejemplo PostgreSQL o Oracle.

Ejemplos string de configuración del atributo dns distintos:

Código PHP:
Ver original
  1. // mysql
  2. $dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password);
  3.  
  4. // sqlite
  5. $dbh = new PDO("sqlite:/path/to/database.sdb");
  6.  
  7. //Firebird
  8.  $dbh = new PDO("firebird:dbname=localhost:C:\Programs\Firebird\DATABASE.FDB", "SYSDBA", "masterkey");
  9.  
  10. //Oracle
  11.  $dbh = new PDO("OCI:", "username", "password")
  12.  
  13. //ODBC
  14. $dbh = new PDO("odbc:Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\accounts.mdb;Uid=Admin");


Puedes separar más las responsabilidades y u obligaciones utilizando el Patrón Factory Method que es una clase que tiene la responsabilidad de crear objetos de otras clases.

Porque utilizar este patrón en tu caso:

Flexibilidad en tiempo de ejecución. A veces es imposible elegir de antemano cuál objeto específico debe ser instanciado, ya que la elección de los objetos a utilizar puede depender de algo en el entorno de ejecución. De esta forma tu clase puede ser tan inteligente que sepa cuando tú utilizas MySQL u otro gestor de bases de datos.

Ejemplo (Parte de este código lo tome de @GavtorV y lo modifique):

config.ini

Código PHP:
Ver original
  1. ; Every interaction with a database begins with a connection.
  2. ; Set here the parameters of the database you are using.
  3. host     = 'localhost'
  4. dbname   = 'dbprueba'
  5. username = 'root'
  6. password = 'prueba'

ConfigReader.php

Para leer el archivo .ini

Código PHP:
Ver original
  1. <?php
  2. class ConfigReader
  3. {
  4.     private $_config;
  5.  
  6.     public function __construct($sFile)
  7.     {
  8.         if (!file_exists($sFile)) {
  9.             throw new Exception('Can\'t find file: '.$sFile);
  10.         }
  11.         $this->_config = parse_ini_file($sFile, true);
  12.     }
  13.  
  14.     public function getConfig()
  15.     {
  16.         return $this->_config;
  17.     }
  18. }
  19. ?>

DatabaseFactory_Interface.php

Código PHP:
Ver original
  1. <?php
  2. interface DatabaseFactory_Interface {
  3. public static function create($sIniFile);
  4. }
  5. ?>

DatabaseFactory.php

Código PHP:
Ver original
  1. <?php
  2. spl_autoload(DatabaseFactory_Interface);
  3. spl_autoload(Registry);
  4. spl_autoload(ConfigReader);
  5. spl_autoload(Database);
  6.  
  7. class DatabaseFactory implements DatabaseFactory_Interface
  8. {
  9.     public static function create($sIniFile)
  10.     {
  11.         if (Registry::exists($sIniFile)) {
  12.             return Registry::get($sIniFile);
  13.         }
  14.  
  15.         $config = new ConfigReader($sIniFile);        
  16.         $config_data = $config->getConfig();
  17.         $database_class = key($config_data);
  18.         spl_autoload($database_class);
  19.         $db = new $database_class($config);
  20.         Registry::add($sIniFile, $db);
  21.         return $db;
  22.     }
  23. }
  24. ?>

MySQL.php

Código PHP:
Ver original
  1. <?php
  2. final class MySQL extends PDO
  3. {
  4.     private $_username;
  5.     private $_password;
  6.     private $_host;
  7.     private $_db;
  8.  
  9.     public function __construct(ConfigReader $config)
  10.     {
  11.         $config_data = $config->getConfig();
  12.         $this->_username = $config_data['MySql']['username'];
  13.         $this->_password = $config_data['MySql']['password'];
  14.         $this->_host = $config_data['MySql']['host'];
  15.         $this->_db = $config_data['MySql']['dbname'];
  16.         $this->_dsn = 'mysql:host='.$this->_host.';dbname='.$this->_db;
  17.         parent::__construct($this->_dsn, $this->_username, $this->_password);
  18.     }
  19. }
  20. ?>

Como usar:

Código PHP:
Ver original
  1. DatabaseFactory::create('config.ini');

De esta forma puedes crear varias clases que hereden de PDO, por ejemplo puedes crear una clase PgSql otra Oracle que hereden de PDO y cada clase tiene su string de configuración del atributo dns distintos. Esta es una de las grandes ventajas del Patrón Factory Method que te permite centraliza en una clase constructora la creación de objetos de un subtipo de un tipo determinado, ocultando al cliente/usuario que puedes ser tu la casuística para elegir el subtipo que crear.

Ademas cumples con un principio de diseño orientado a objetos muy importante, que es el Principio Open/Close “desarrolla cerrado al cambio y abierto a la extensión”. Si el día de mañana necesitas dar soporte a otro gestor de bases de datos, simplemente creas la clase especifica la extiendes de PDO y le configuras el string de configuración del dns específico. Como vez abierto la extensión y cerrado al cambio.

Mayor performance y escalabilidad.

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