Ver Mensaje Individual
  #1 (permalink)  
Antiguo 16/12/2007, 19:42
Avatar de pragone
pragone
 
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 17 años
Puntos: 2
Pregunta Podrían darme comentarios sobre esta librería

Hola,
Tengo ya bastante tiempo trabajando en PHP, pero soy relativamente nuevo para lo que es PHP5 por lo que el fin de semana pasado decidí dar el salto y empezar portando a PHP algo que había hecho una ve en Java. La idea es una implementación de ActiveRecords, o lo que es lo mismo, una clase que te permita crear los objetos de acceso a la base de datos sin necesidad de crearlos tú.

Lo he llamado PHP5DBObject (traten de conseguir un nombre mejor y que esté disponible en SourceForge ) en fin he creado ahí el proyecto y lo estoy liberando bajo una licencia LGPL, pero quería pedir (a quien tenga un rato) que le de un vistazo y me haga cualquier recomendación que le venga a la cabeza.
La página del proyecto es: http://sourceforge.net/projects/php5dbobject

Un poco la idea es la siguiente: Supón que tienes la siguiente tabla:
usuario
id: int auto_increment
name: varchar(100)

Pues para poder acceder a los datos de la tabla te basta con:
Código PHP:
<?php
require_once 'PHP5DBObject.php';

$config = array(
  
'Usuario' => array(
    
'table' => 'usuario',
    
'fields' => ('id' => 'integer''name' => 'text')),
    
'pk' => array('id' => array('insert' => false))
  )
);

PHP5DBObject::setup($config);
PHP5DBObject::setDefaultConnection($conn); // Conn es un objeto de conexión que implemente DBManager (se incluye uno)

// Hecho esto ya se puede trabajar con la base de datos.
// Crear un usuario es:
$usuario = new Usuario();
$usuario->name 'Paolo';
$usuario->create();
print 
$usuario->id// Contiene el valor del id auto-asignado

// Para obtener un usuario:
$id 4;
$usuario =& Usuario::factory($id);
print 
$usuario->id ': ' $usuario->name;

// Para obtener los usuarios que empiecen por 'Pa' sería (primera página de hasta 50 registros):
$usuarios Usuario::browse("name like '?%'", array('Pa'), 'name asc'501);
foreach(
$usuarios as $usuario) {
 print 
$usuario->id ': ' $usuario->name '<br/>';
}

// Eliminar un usuario sería:
Usuario::delete(4);

// Actualizar un usuario es:
$id 4;
$usuario =& Usuario::factory($id);
$usuario->setName('Nuevo nombre'); // también soporta getters y setters a la Java
$usuario->update();

?>
Aparte de esto si un usuario tiene relacionado email:
email
id: int auto_increment
usuario_id: int
email: varchar(100)

Bastaría con que el config sea:

Código PHP:
$config = array(
  
'Usuario' => array(
    
'table' => 'usuario',
    
'fields' => ('id' => 'integer''name' => 'text')),
    
'pk' => array('id' => array('insert' => false)),
    
'methods' => array(
      
'getEmails' => array(
        
'method' => 'getList',
        
'class' => 'Email',
        
'table' => 'email',
        
'select' => array(array('tableField' => 'id''classField' => 'id')),
        
'where' => array(array('tableField' => 'usuario_id' 'instanceField' => 'id'))
      )
    )
  ),
 
'Email' => array(
    
'table' => 'usuario',
    
'fields' => ('id' => 'integer''usuario_id' => 'integer''name' => 'text')),
    
'pk' => array('id' => array('insert' => false)),
    
'methods' => array(
      
'getUser' => array(
        
'method' => 'getFK',
        
'class' => 'User',
        
'fieldMaps' => array(array('classField' => 'id''instanceField' => 'usuario_id'))
      ),
      
'setMain' => array(
        
'method' => 'setFK',
        
'class' => 'User',
        
'fieldMaps' => array(array('classField' => 'id''instanceField' => 'usuario_id'))
      )
    )
  )
); 
Y ya tendrías disponible métodos para:

Código PHP:
$usuario =& Usuario::factory(4); // Obtienes el usuario id=4
$emails $usuario->getEmails();
foreach (
$emails as $email) {
  print 
$email->email '<br/>';

También hay otros métodos que permiten trabajar con relaciones N:N y esto define otros métodos que te permiten abstraerte completamente de la BD.

Tiene también (por desarrollar) un soporte para cache.

En fin, si les parece interesante, les animo a que le den un vistazo y por favor, no duden en hacerme cualquier pregunta.

Saludos