October 2nd, 2009 Category: Programacion Zend Framework
9 Comments »
Muchos componentes de Zend Framework, utilizan “Adapters”, estos adapters corresponden a la implementacion del patron con el mismo nombre Patron Adapter.
La idea es simple. Tenemos un componente que hace ciertas cosas. Por ejemplo manejar una base de datos. Este tiene un metodo conectarse(), traerTodo(), traerLosUltimos10(), etc. Nuestro componente nos dice que tenemos estos metodos disponibles, sin importar el motor de base de datos que utlizemos. Lo unico que requerie es que le pasemos que adapter vamos a usar. Este componente no tiene la logica de como hacer para conectarse a una base, lo unico que hace es llamar al metodo con el mismo nombre del adapter que le pasamos, y hacer funciones comunes en el caso que se necesiten.
La estructura de nuestro
class MyComponent_DB
{
private $_conn;
public function __construct()
{}
public function traerTodos(iMyAdapter $adapter )
{
return $adapter->traerTodos();
}
public function conectarse(iMyAdapter $adapter )
{
$this->_conn = $adapter->conectarse();
return true;
}
public function traerLosUltimos10(iMyAdapter $adapter )
{
return $adapter->traerLosUltimos10(();
}
}
Nuestros adapter tendrian que implementar la siguiente interfaz
interface iMyAdapter
{
public function traerTodos();
public function conectarse();
public function traerLosUltimos10( );
}
De esta forma nuestro adapter para mysql tendria la siguiente forma
class MyAdapter implement iMyAdapter
{
private $_link;
public function traerTodos()
{
// @todo logica de mysql para traer todos los registros de una tabla
}
public function conectarse()
{
$this->_link = mysql_connect('localhost', 'usuario', 'qwerty');
mysql_select_db('prueba');
}
public function traerLosUltimos10()
{
// @todo logica para traer los ultimos10 registros de una tabla
}
}
Podriamos crear la cantidad de adapters que creamos necesarios, para Oracle, para sqlite, etc.
Lo unico que hay que tener en cuenta es que nosotros tenemos que pasarle a la clase MyComponent_DB el adapter que querramos usar.
Cada uno va a contener su propia logica para hacer lo mismo que el resto de los adapters pero a su manera.
Esta misma idea podemos migrarla a otras funcionalidades como la de Autenticar un usuario, administrar roles, paginar, usar js en nuestro codigo, etc.
Invitame una Cerverza
Comentar
9 Responses
En ese caso lo unico que deberias hacer es
$db = Zend_Db::factory('PDO_MYSQL', $options);
Zend_Registry::set('my_db', $db);
cambias my_db, y options, dependiendo de los datos de conexion de cada base.
Despues instancias el modelo de esta manera
$table = new Modelo(array('db' => 'my_db'));
Aca tenes mas info http://framework.zend.com/manual/en/zend.db.table.html
Saludos.
no habria forma de hacer esto que me dices pero solo una ves al seleccionar la base de datos con la que quiero trabajar?
hasta que la cambie nuevamente seleccionanado otra.
lo que pretendo es que el usuario seleccione la base de datos al seleccionar enviar un parametro al servidor y con este parametro establecer la coneccion a la base que corresponda ya que mis bases de datos son identicas pero estan en diferentes ciudades espero me entiendas y me puedas dar una manito gracias
Despues de $db = Zend_Db::factory(’PDO_MYSQL’, $options);
Haces
Zend_Db_Table_Abstract::setDefaultAdapter($db);
Y todo lo que hagas en la db va a hacer en la ultima que instanciaste
como le paso este parametro para hacer
Zend_Db_Table_Abstract::setDefaultAdapter($db);
segun seleccione el cliente exactamente ese es mi problema veras he intentado coger los parametros en el index.php que es el que llama a bootstrap para mandarselo com oparametros y asi coger la base con la que el usaurio quiera trabajar pero los $_GET y $_POST de php estan vacios no me llega nada.
he intentado poner esto en un controller para que segun el parametro cambie a la base de datos pero aun asi nada pues no se que mas hacer gracias
function serverAction() {
//$this->_helper->layout->disableLayout ();
$this->_helper->viewRenderer->setNoRender ();
$data = $this->getRequest()->getParam("name");
$options = array (Zend_Db::AUTO_QUOTE_IDENTIFIERS => true );
echo " en LPZ :".($data=="La Paz");
echo " en STZ :".($data=="Santa Cruz");
echo " en LPZ :".($data=="cochabamba");
echo " ";
if($data=="La Paz"){
$conf = array ('host' => "ip1",
'username' => "user1",
'password' => "pas1",
'dbname' => "db1",
'options' => $options ) ;
}elseif($data=="Santa Cruz"){
$conf = array ('host' => "ip2",
'username' => "user2",
'password' => "pas2",
'dbname' => "db2",
'options' => $options ) ;
}else{
$conf = array ('host' => "localhost",
'username' => "admin",
'password' => "admin",
'dbname' => "quantum",
'options' => $options ) ;
}
try {
$db = new Zend_Db_Adapter_Pdo_Pgsql ($conf);
$db->getConnection ();
// $db->setFetchMode(Zend_Db::FETCH_OBJ);
Zend_Db_Table::setDefaultAdapter ( $db );
Zend_Registry::set ( "database", $db );
} catch ( Zend_Db_Adapter_Exception $e ) {
if ($this->_config->enable_file_logger) {
$fileLogger->log ( 'Database Error: ' . $e->getMessage (), 1 );
}
} catch ( Zend_Exception $e ) {
if ($this->_config->enable_file_logger) {
$fileLogger->log ( 'Error: ' . $e->getMessage (), 1 );
}
}
$adapter = Zend_Db_Table::getDefaultAdapter ( );
$this->view->serverSelected=$data;
//$this->_forward("index", "index");
print_r($adapter->getConfig());
echo $data;
}
en la ultima linea recupero y muestro la configuracion y siempre es la de cbba y no cambia la configuracion que podra ser?



quisiera preguntarte si se puede cambiar de base de datos desde la aplicacion osea mas o menos un pgadmin
el cliente debe poder seleccionar una ciudad y el sistema debe cambiarse a la base de datos de esa ciudad y todas las consultas realizarlas en esa base de datos.
nose si me dejo entender pero agradecere tu orientacion