Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Podrían darme comentarios sobre esta librería

Estas en el tema de Podrían darme comentarios sobre esta librería en el foro de Frameworks y PHP orientado a objetos en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 16/12/2007, 19:42
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
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
  #2 (permalink)  
Antiguo 16/12/2007, 21:53
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Podrían darme comentarios sobre esta librería

Esta interesante, y si quieres mejorarla/complementarla hay muchas clases muy poderosas que implementan lo que la tuya (date una vuelta por Creole) para que veas que tanto campo podrias abarcar.

Saludos.
  #3 (permalink)  
Antiguo 17/12/2007, 01:26
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Podrían darme comentarios sobre esta librería

Parece interesante por lo que he podido leer en 5 minutos.
Lo descargaré y le daré un vistazo, aunque por lo que me pareció leer Creole es justo una capa por debajo de mi librería. Yo de hecho me monto encima de PEAR::MDB2 para acceso a BD y sólo manejo la parte de estructura de datos a objetos y relación entre tablas, no la conexión a la BD.
Cuando haya podido revisarlo mejor te comento.
  #4 (permalink)  
Antiguo 17/12/2007, 08:41
 
Fecha de Ingreso: agosto-2007
Mensajes: 14
Antigüedad: 16 años, 8 meses
Puntos: 0
Re: Podrían darme comentarios sobre esta librería

Hola yo estoy usando las clases de zend_db (framework Zend). Con esto podemos hacer nuestra clase "Tabla" que extienda de la clase Table especificando el nombre de la tabla y la clave primaria. Luego podemos obtener una fila pasando solo la PK hacer búsquedas, actualizaciones, etc. Creo que es la misma funcionalidad que buscáis. Además podemos crear queris complejas multimotor etc. Estas clases se integran en el framework que ofrece muchas más funcionalidades(implementación de patrones, localización,...), aunque no hace falta usar todo el framework puedes usar zend_db y desechar todos los demás componentes. Mirad en www.framework.zend.com .
  #5 (permalink)  
Antiguo 17/12/2007, 10:15
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Podrían darme comentarios sobre esta librería

Sí.... he estado viendo el framework y el objeto Table implementa métodos similares a los de mi librería (para hacer selects, update, insert y delete), sin embargo, no provee "out-of-the-box" funcionalidades para recorrer las relaciones de un objeto a otros (el ejemplo del $emails = $usuario->getEmails(); ).
A ver... que el framework de Zend está bastante bien, pero me parece que tener que cargar la estructura de la tabla en cada request es un poco pesado, es una sentencia que te podrías ahorrar con un poco de configuración.
Además, esta librería tiene otro beneficio que no había comentado (ni desarrollado todavía). Voy a crearle una función que permita crear las clases que provee, es decir, eventualmente habrá un comando que dado el archivo de configuración genere el Usuarios.php y Email.php (siguiendo el ejemplo del principio), con todos los métodos hard-coded y por lo tanto quitando a la clase PHP5DBObject del medio y reduciendo el overhead a cero. (esto tendrá sentido una vez que tu estructura se encuentre estable).
  #6 (permalink)  
Antiguo 17/12/2007, 11:45
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Podrían darme comentarios sobre esta librería

Perdon en mi post pasado me refería a Propel, no a Creole, te recomiendo le des una leida: http://propel.phpdb.org/trac/

Es una clase con abstracción de alto nivel, para crear objetos simples que manejen todas las relaciones.

En base a tu comentario sobre Zend, si maneja relaciones y métodos mágicos, como: getEmaisByUser, automáticamente transfiere y crea los métodos necesarios.

Saludos.
  #7 (permalink)  
Antiguo 17/12/2007, 14:13
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Podrían darme comentarios sobre esta librería

GatorV,

Esto sí se parece MUCHO a la librería en la que estoy trabajando, muchas gracias por el enlace
Le daré un vistazo porque creo que es un alma gemela de lo que quiero conseguir... si es así y no tiene gran diferencia veré si mejor me uno a ese proyecto.
  #8 (permalink)  
Antiguo 17/12/2007, 14:54
Avatar de pragone  
Fecha de Ingreso: diciembre-2007
Ubicación: Madrid
Mensajes: 223
Antigüedad: 16 años, 4 meses
Puntos: 2
Re: Podrían darme comentarios sobre esta librería

Jajaja... es increíble el parecido... en mi librería la configuración de una tabla es (cuando la haces por XML):
<table name="main">
<field type="integer" isPK="true" includeInInsert="false">id</field>
<field type="text">name</field>
</table>
en la de ellos:
<table name="book">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true"/>
<column name="title" type="varchar" size="255" required="true" />
</table>

En la mía crear un registro es:
Código PHP:
$usuario = new Usuario();
$usuario->name 'Paolo'// seters al estilo Java también se soportan
$usuario->create(); 
y en Propel es:
Código PHP:
$author = new Author();
$author->setFirstName("Jack");
$author->setLastName("London");
$author->save(); 
Los métodos para modificar, eliminar y cargar de BD por clave primaria son "IDENTICOS", así como los métodos para obtener objetos relacionados por claves foráneas y setear claves foráneas con objetos.

Lo único que no me gusta de Propel (y donde veo una diferencia interesante) es:
1) Mi librería no requiere la fase de creación de los objetos. Los objetos pueden ser creados en forma dinámica en tiempo de ejecución, es luego de que se ha estabilizado la estructura de la BD que por razones de rendimiento podrás compilarla (como dije antes... aunque esa funcionalidad todavía está en desarrollo).
2) Soy un fanático de la optimización (y debo serlo, me encargo de un sitio con aprox. 110MM de páginas vistas al mes) por lo que no me gusta tener que incluir paquetes como el Criteria que a mi forma de ver ponen bonito el código, pero no te ayudan para nada... ayudan a que la librería pueda ser más sencilla por dentro... pero si tengo que escribir 15 líneas de código para hacer un WHERE complicado, prefiero simplemente escribir el WHERE yo mismo. Además, mi librería tiene hasta el momento casi la misma funcionalidad que Propel (aunque le falta bastante en término de manejo de errores) y es un solo archivo con unas 500 lineas de código.
3) Tiene la misma gran limitación que mi librería: no puedes manejar atributos en las tablas intermedias que usas para relaciones N:N (estoy trabajando en algo para eso)
4) No tiene un soporte adicional para Caching. Aunque todavía no he hecho un buen sistema de cache, ya tengo una interfaz que permite extender la funcionalidad integrando dicho sistema. La interfaz la he modelado basándome en Memcached de la gente de Danga (esta gente es Genial!)

Ahora bien, tiene algunas cosas que me parecen bien, puedes definir las acciones a tomar en caso de un delete, es decir puedes decir si una clave foránea debe hacer eliminación en cascada y eso puede ser útil (sobre todo con algunas DB como MySQL con MyISAM).

En fin... creo que estudiaré con un poco más de profundidad a Propel, pero excepto que vea algo más que sea realmente interesante, seguiré con el desarrollo de mi librería, orientándola a usuarios que busquen algo más "light" con las mismas prestaciones.

De nuevo, gracias GatorV por el enlace, el proyecto está muy interesante.

Si alguien tiene algún otro comentario o enlace es altamente bienvenido.
  #9 (permalink)  
Antiguo 17/12/2007, 15:28
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Re: Podrían darme comentarios sobre esta librería

La fase de creación creo yo es algo importante de Propel, ya que como bien ponías tu en un Post anterior, acelera el código y al usar PDO la hace muy rápida, yo estoy a favor de Propel aunque no lo uso mucho en mis desarrollos (tengo mi propia clase como Zend_Table).

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:10.