Introduction

Qué provee Propel

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.

Propel puede ser descrito como un mapeado objeto-relacional, una capa DAO, o una capa objeto persistente. Propel es un puerto de Apache torque . 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.

Para esos familiares con patrones O/R, Propel inicialmente implementa el patron entrada de datos en fila, como lo describe Martin Fowler, para representar la base de datos. Por citar a Fowler:

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.

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:

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.

En Propel las clases de tabla de entrada de datos es llamada clasesPeer, mientras las clases de filas de entrada de datos es llamada entidad o clases objeto .

Como una aplicación, Propel tiene dos componentes principales (y ahora formalmente separados):

  1. Un motor generador para construir sus clases y archivos SQL(generador-propel)
  2. 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(propel)

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).

Aproximación

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 (Creole) tipos de columna.

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.

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.

Motivaciones

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):

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.

ALYOOP

ALYOOP es una simple estructura PHP5 DAO. Que puede o no estar bajo desarrollo.

Algunas diferencias:

DB_DataContainer

DB_DataContainer es un paquete flexible PEAR que provee una estructura simple DAO.

Algunas diferencias:

DB_DataObject

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.

Algunas diferencias:

DB_Table

DB_Table es otro paquete PEAR que provee un nivel de tabla de abstracción DB.

Algunas diferencias:

EasyORM

No examinamos EasyORM en más detalle es como una solución MySQL únicamente

Metastorage

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.

Algunas diferencias:

 

Muestrame!

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.

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.

Para empezar, aqui hay un ejemplo muy simple de una definición de modelo 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>

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).

Clase Proposito
BaseBook, Book 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.
BaseBookPeer, BookPeer 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.
BookMap 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.

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()).

// 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();
}

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.