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// mysql
$dbh = new PDO("mysql:host=$hostname;dbname=mysql", $username, $password);
// sqlite
$dbh = new PDO("sqlite:/path/to/database.sdb");
//Firebird
$dbh = new PDO("firebird:dbname=localhost:C:\Programs\Firebird\DATABASE.FDB", "SYSDBA", "masterkey");
//Oracle
$dbh = new PDO("OCI:", "username", "password")
//ODBC
$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; Every interaction with a database begins with a connection.
; Set here the parameters of the database you are using.
host = 'localhost'
dbname = 'dbprueba'
username = 'root'
password = 'prueba'
ConfigReader.php
Para leer el archivo .ini
Código PHP:
Ver original<?php
class ConfigReader
{
private $_config;
public function __construct($sFile)
{
throw new Exception('Can\'t find file: '.$sFile);
}
}
public function getConfig()
{
return $this->_config;
}
}
?>
DatabaseFactory_Interface.php
Código PHP:
Ver original<?php
interface DatabaseFactory_Interface {
public static function create($sIniFile);
}
?>
DatabaseFactory.php
Código PHP:
Ver original<?php
class DatabaseFactory implements DatabaseFactory_Interface
{
public static function create($sIniFile)
{
if (Registry::exists($sIniFile)) {
return Registry::get($sIniFile);
}
$config = new ConfigReader($sIniFile);
$config_data = $config->getConfig();
$database_class = key($config_data); $db = new $database_class($config);
Registry::add($sIniFile, $db);
return $db;
}
}
?>
MySQL.php
Código PHP:
Ver original<?php
final
class MySQL extends PDO
{
private $_username;
private $_password;
private $_host;
private $_db;
public function __construct(ConfigReader $config)
{
$config_data = $config->getConfig();
$this->_username = $config_data['MySql']['username'];
$this->_password = $config_data['MySql']['password'];
$this->_host = $config_data['MySql']['host'];
$this->_db = $config_data['MySql']['dbname'];
$this->_dsn = 'mysql:host='.$this->_host.';dbname='.$this->_db;
parent::__construct($this->_dsn, $this->_username, $this->_password);
}
}
?>
Como usar:
Código PHP:
Ver originalDatabaseFactory::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.