<!--
-File $Id: Introduction.html,v 1.3 2004/07/15 02:57:48 hlellelid Exp $
-License GNU FDL (http://www.gnu.org/copyleft/fdl.html)
-Copyright 2003, Propel project
-Author Hans Lellelid, hide@address.com
-->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/2000/REC-xhtml1-20000126/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Guía Propel</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<link rel="Stylesheet" rev="Stylesheet" href="../css/Documentation.css" type="text/css" charset="iso-8859-1"/>
</head>
<body>
<h1>Introduction</h1>
<h2><a name="Introducción.What"></a>Qué provee Propel</h2>
<p>Propel es un servicio de objeto persistente y de consulta -- lo que significa que Propel
provee un sistema para almacenar objetos en una base de datos y un sistema para búsqueda
y restauración de objetos desde una base de datos. Propel le permite realizar
consultas complejas y manipulación de bases de datos sin escribir una sola cláusula SQL.
Propel hace más fácil la escritura de aplicaciones, más fácil de desplegar, y mucho más fácil
para migrar si alguna vez la situación lo amerita.</p>
<p>Propel puede ser descrito como un mapeado objeto-relacional, una capa DAO, o una
capa objeto persistente. Propel es un puerto de <a href="Bibliography.html#bib.torque">Apache torque
</a>. Basado en acercamientos probados, desarrollado por el proyecto Torque y optimizado
para PHP, Propel espera proporcionar un inteligente y comprensivo servicio de manejo de datos
con un mínimo costo de realización para su aplicación en PHP.</p>
<p>Para esos familiares con patrones O/R, Propel inicialmente implementa el patron entrada de datos en fila, como <a href="Bibliography.html#bib.martinfowler">lo describe
Martin Fowler</a>, para representar la base de datos. Por citar a Fowler:</p>
<blockquote>Una entrada de datos de fila le da objetos que lucen exactamente como el registro
en su estructura de registros pero puede ser accedido con los mecanismos regulares de
su lenguaje de programación habitual. Todos los detalles de acceso de fuentes de datos estan ocultos detrás
de esta interfaz. </blockquote>
<p>Sin embargo, Propel tambié genera las clases para cada tabla que exibe algunas de
las propidades de la tabla del patrón datos de entrada:</p>
<blockquote>Una tabla de entrada de datos almacena todo el SQL para aceder a una sola tabla o vista:
selecciones, inserciones, actualizaciones, y eliminaciones. Otro código llama los métodos para todas
las interacciones con la base de datos.</blockquote>
<p>En Propel las clases de tabla de entrada de datos es llamada clases<em>Peer</em>,
mientras las clases de filas de entrada de datos es llamada <em>entidad</em> o clases <em>objeto</em>
.</p>
<p>Como una aplicación, Propel tiene dos componentes principales (y ahora formalmente separados):</p>
<ol>
<li>Un motor generador para construir sus clases y archivos SQL(<em>generador-propel</em>)</li>
<li>Un ambiente de ejecución que proporciona herramientas para construir consultas SQL, ejecutando
consultas compiladas, y herramientas para el manejo de conecciones para multiples bases de datos
simultáneamente(<em>propel)</em></li>
</ol>
<p>El ambiente de ejecución proporciona una capa de abstracciones y encapsulación
de bases de datos reglas logicas de negocios. Las clases Propel representan la capa modelo del
tradicional MVC, diseñado para encapsular cualquier nivel de validación de dato necesitado por
su aplicación. El siguiente diagrama ilustra como Propel existe en relación
a Creole y las subyacentes bases de datos. (Note que el máximo-nivel significa poder
encarnar cualquier aplicación PHP, y puede bien envolver cualquier capa adicional).</p>
<p><img src="../images/diagramonwhite.gif" width="663" height="586" /></p>
<h2><a name="Introduction.Approach"></a>Aproximación</h2>
<p>Hay un número de implementaciones de objetos persistentes -- proporcionando diferentes
niveles de abstracción, algunos son abstraidos hacia el punto donde los objetos pueden incluso
ser persistentes a no-SQL backends. Propel es una capa muy literal de persistencia de objetos:
El modelo de datos XML corresponde muy cerca a la estructura de la base de datos.
Entidades en Propel son siempre tablas; relaciones son especificadas usando llaves
extranjeras; los tipos de columnas de propel corresponden casi directamente con el nivel de base de datos
<a href="Bibliography.html#bib.creole">(Creole)</a> tipos de columna. </p>
<p>Qué significa esto en términos simples para los usuarios de Propel? Esto
significa que Propel es completamente fácil de aprender y también completamente flexible -- en eso
usted puede ser confidenta cuando sideña su estructura de tabla inter-relacionada que
trabaja como se espera en Propel. el desarrollo es también maximizado utilizando
un sistema mínimo de abstracción. En la otra mano, porque las entidades de Propel son
siempre tablas, es un eficiente modelo de inerencia básico -- mapeando todas las
subclases a una simple tabla de base de datos. También, algunas operaciones en Propel requieren
pasos intermedios adicionales -- como por ejemplo, manejando relaciones de muchos-a-muchos
requiere un uso explicito de la tabla de referencias-cruzadas en sus scripts de PHP.</p>
<p>Mientras, algunas elegancias son sacrificadas para un modelo de persistencia literal, sentimos
que los beneficios en la curva de aprendizaje, flexibilidad, y desarrollo exede en peso cualquier
desventaja en este sistema. El objetivo con Propel es proveer un herramienta que greatly
incremente la productividad de desarrollo, mientras aún somos lo suficiente pesoliviano para ser
útil en un ambiente PHP.</p>
<h2><a name="Introduction.Motivations"></a>Motivaciones</h2>
<p>Hay practicamente un número de capas de objetos persistentes para Java (Torque, Hibernate,
Castor, and OJB por nombrar algunos); sin embargo, hay pocas soluciones que alguna vez
proveen un mapeo básico O/R para PHP. Como PHP está siendo utilizado de forma creciente en
despliegues de larga-escala O/R, las herramientas para PHP se estan volviendo más prevalecentes.
Aqui hay un vistazo de algunos proyectos similares que existen actualmente en varios escenarios
de desarrollo para PHP (algunos han aparecido después de Propel):</p>
<ul>
<li> <a href="Bibliography.html#bib.alyoop">ALYOOP</a> - un simple PHP5 DAO framework</li>
<li><a href="Bibliography.html#bib.db_datacontainer">DB_DataContainer</a> -
una solución PEAR-compliant O/R.</li>
<li><a href="Bibliography.html#bib.db_dataobject">DB_DataObject</a> - solución de mapeo Oficial
PEAR O/R con generación de código PHP.</li>
<li><a href="Bibliography.html#bib.db_table">DB_Table</a> - Paul M. Jones' herramienta
para abstraer una tabla de base de datos.</li>
<li><a href="Bibliography.html#bib.easyorm">EasyORM</a> - unsolución de objetos persistentes para MySQL-únicamente.</li>
<li><a href="Bibliography.html#bib.metastorage">Metastorage</a> - Una de las capas más
comprensivas persistentes para PHP, incluye generación de clases PHP</li>
</ul>
<p>Al poco tiempo decidimos crear Propel porque quisimos algo con lo cual se pudieran
crear aplicaciones complejas de bases de datos significantemente más fácil sin sacrificar
flexibilidad. Rather than look at por qué no lo hicimos como algunas de esas soluciones,
aqui hay una breve descripción de como algunos de ellos se diferencian. Trataremos de mantenerlo
lentamente object -- y permitir que usted haga las evaluaciones y juicios finale acerca de las otras
soluciones.</p>
<p><strong>ALYOOP</strong></p>
<p>ALYOOP es una simple estructura PHP5 DAO. Que puede o no estar bajo desarrollo.
</p>
<p>Algunas diferencias:</p>
<ul>
<li>Utiliza PEAR::DB, y desde aquí PEAR_Error, etc.</li>
<li>Un ambiente simple de ejecución, manejo de objetos consulta y persistencia.</li>
<li>No es usada la descripción de archivos para la auto-generación (el generador de clases crea
subclases vacias como punto de partida).</li>
<li>No hay criterios basados en el sistema de consulta OO; en lugar de eso son usados filtros los cuales representan
adiciones a la calusula WHERE de SQL.</li>
</ul>
<p><strong>DB_DataContainer</strong></p>
<p>DB_DataContainer es un paquete flexible PEAR que provee una estructura simple DAO.</p>
<p>Algunas diferencias:</p>
<ul>
<li>Es una clase flexible PEAR, por ello usa PEAR::DB, PEAR_Error, etc.</li>
<li>DB_DataContainer no genera clases PHP, sin embargo aparentemente
genera métodos de acceso(?)</li>
<li>Es similar en diseño (entrada de datos en columna) a DB_DataObject; sin embargo esta clase
tiene un API más simple y no utiliza archivos INI.</li>
<li>Se integra con DB_DataContainer_Form</li>
<li>No hay criterios basados en el sistema de consulta OO.</li>
</ul>
<p><strong>DB_DataObject</strong></p>
<p>DB_DataObject es un paquete PEAR que hace una generación básica de código y
posee un soporte básico para las relaciones.</p>
<p>Algunas diferencias:</p>
<ul>
<li>Es una clase PEAR , por ello usa PEAR::DB, PEAR_Error, etc.</li>
<li>DB_DataObject utiliza sólo el patrón de entrada de datos en columna [<a href="Bibliography.html#bib.martinfowler">revise
los patrones EAA</a>]. Como su nombre lo dice, el diseño si es mucho más simple: hay esencialmente
una [gran] clase de la cual todas las tablas de filas heredan.</li>
<li>DB_DataObject requiere que la base de datos ya exista; luego crea los archivos INI
que describen la base de datos para referencias internas.</li>
<li>DB_DataObject no usa las funciones getter/setter, pero expone las propiedades
de la columna como publicas. Alan reconoce los méritos
de este diseño; y de los beneficios de desarrollo.</li>
<li>No hay criterios basados en el sistema de consulta, sin embargo métodos como <em>whereAdd() </em>
pueden construirse manualmente en SQL y las búsquedas pueden incluso serdesarrolladas usando
un método <em>find() </em>que construye SQL basado en los valores del
objeto actual.</li>
<li>Posee integración con el paquete HTML_Quickform de PEAR .</li>
</ul>
<p><strong>DB_Table</strong></p>
<p>DB_Table es otro paquete PEAR que provee un nivel de tabla de abstracción DB.</p>
<p>Algunas diferencias:</p>
<ul>
<li>Es una clase PEAR, por ello usa PEAR::DB, PEAR_Error, etc.</li>
<li>DB_Table provee solamente un patrón de entrada de datos [<a href="Bibliography.html#bib.martinfowler">revise
patrones EAA</a>].</li>
<li>DB_Table usa solves RDBMS-emision de implementación específica,esencialmente
no utiliza tipos nativos RDBMS -- ej. para fechas una columna VARCHAR es usada en lugar de
DATE/TIME/TIMESTAMP.</li>
</ul>
<p><strong>EasyORM</strong></p>
<p>No examinamos EasyORM en más detalle es como una solución MySQL únicamente</p>
<p><strong>Metastorage</strong></p>
<p>Metastorage es probablemente la mós completa en orden de soluciones, y mas bien
similar a Propel en terminos del uso de XML para el modelo de descripción y consultar
una fase de construcción para crear clases PHP.</p>
<p>Algunas diferencias:</p>
<ul>
<li>Metastorage usa XML para personalización de clases de comportamiento; Propel usa clases
de extension / métodos override. La personalización de Metastorage requiere algún conocimiento
meta-lenguaje XML para crear código. </li>
<li>Metastorage utiliza Metabase como una capa de abstracción de la base de datos, y como su nombre lo dice soporta
un amplio arreglo de bases de datos que la combinación Propel+Creole.</li>
<li>Teóricamente Metastorage puede crear objetos persistentes para cualquier lenguaje
(Java), aunque en la próctica es solo generación de clases PHP. Propel puede
en teoría inclusive ser extendido para crear objetos en otros lenguajes (el camino
ha sido extendido para crear objetos persistentes en PHP4), pero un nuevo ambiente de
ejecución tendría que ser creado en en lenguaje objetivo.</li>
<li>Parece correcto decir que Metastorage no tiene ambiente de ejecución;
todo es almacenadoe en los objetos generados. Propel utiliza algunas clases centrales
para manejar la conexión a las bases de datos, y almacena código común para construir consultas,
etc.</li>
<li>Metastorage no provee un criterio basado en un systema de construcción de consultas; en su lugar
él genera metodos que encapsulan totalmente las consultas -- ej. getBooksByName().</li>
</ul>
<p> </p>
<h2><a name="Introduction.ShowMe"></a>Muestrame!</h2>
<p>Propel es realmente simple de usar. Básicamente, usted necesita definir su modelo
de datos en XML, especificar cualquier propiedad de construcción (ej. cual base de datos usted esá construyendo)
y entonces "construir"su modelo de objeto. Construyendo su modelo de objeto
creará archivos de definiciones SQL y -lo más importante- las clses PHP que usted necesita
para utilizar su base de datos desde su aplicación.</p>
<p>Esto no quiere decir que esto es una guía de inicio rápido (eso viene más adelante), pero clasifica como
un breve abrebocas de lo que significa utilizar propel.</p>
<p>Para empezar, aqui hay un ejemplo muy simple de una definición de modelo de datos:</p>
<pre title="definición simple de datos">
<?xml version="1.0" encoding="ISO-8859-1"?>
<database name="bookstore">
<table name="book">
<column name="book_id" type="INTEGER" required="true" primaryKey="true"/>
<column name="title" type="VARCHAR" size="50" required="true" />
</table>
</database></pre>
<p>Construyendo este modelo de datos se crearan muchas clases PHP que usted usara para
adicionar y encontrar datos en la tabla "libro". Propel propel va incluso a generar un
par de subclases vacias entonces usted podrá perzonalizar el comportamiento sin hacer
al código generado (el cual puede ser reescrito cuando usted regenere
su modelo de objeto más tarde).</p>
<table>
<thead>
<tr>
<th>Clase</th>
<th>Proposito</th>
</tr>
</thead>
<tbody>
<tr>
<td>BaseBook, Book</td>
<td>BaseBook representa la clase base para una fila de la tabla libro. Libro
es la subclase vacia en donde las personalizaciones fueron adicionadas; las consultas
retornaran un arreglo de objetos del tipo libro. </td>
</tr>
<tr>
<td>BaseBookPeer, BookPeer</td>
<td>La clase Peer es una clase que posee unicamente metodos estaticos que agiliza las consultas
y manipulaciones contra la tabla libro. Todas las referencias deben ser para BookPeer
que es una subclase vacia (para personalización) de BaseBookPeer. </td>
</tr>
<tr>
<td>BookMap</td>
<td>Este contiene un mapa de la base de datos para la tabla libro. Rather than having
para agilizar las bajas consultas a metadatos en tiempo de ejecución (ej. conocer cuales columnas
son llaves primarias, llaves foraneas, etc.), Propel compila una clase mapa que puede
rapidamente retornar información relevante acercade la estructura de la tabla.</td>
</tr>
</tbody>
</table>
<p>En su aplicación PHP, puede incluir y utilizar nuevas clases libro justo y como se haría
en cualquier otra clase PHP. tras las ecenas, Propel manejará todas las
llamadas nativas a funciones en bases de datos SQL(ej. mysql_query()).</p>
<pre title="Uselo">// example using business objects
$b = new Book();
$b->setTitle("War & Peace");
$b->save();
// "peer" class is static class that handles things like queries
$c = new Criteria();
$c->add(BookPeer::TITLE, "War%", Criteria::LIKE);
$c->setLimit(10);
$books = BookPeer::doSelect($c);
foreach($books as $book) {
print "<br/>" . $book->getTitle();
}</pre>
<p>Desde luego hay un un poco más complicado -- y la mayoría de las bases de datos son un poco
más complejos que nuestro ejemplo de "libro" -- pero esto le dá una idea
básica de como es realmente simple integrar Propel dentro de su aplicación PHP.</p>
</body>
</html>