¿Debo elegir Doctrine 2 o Propel 1.5 / 1.6, y por qué? [cerrado]

30

Me gustaría saber de aquellos que han usado Doctrine 2 (o posterior) y Propel 1.5 (o posterior). La mayoría de las comparaciones entre estos dos mapeadores relacionales de objetos se basan en versiones antiguas: Doctrine 1 versus Propel 1.3 / 1.4, y ambos ORM experimentaron un rediseño significativo en sus revisiones recientes. Por ejemplo, la mayoría de las críticas a Propel parecen centrarse en las clases "ModelName Peer ", que en cualquier caso están en desuso.

Esto es lo que he acumulado hasta ahora (y he tratado de hacer esta lista lo más equilibrada posible ...):

  • Impulsar
    • Pros
      • Extremadamente compatible con IDE, porque se genera código real, en lugar de depender de métodos mágicos de PHP. Esto significa que las características IDE como la finalización de código son realmente útiles.
      • Rápido (en términos de uso de la base de datos: no se realiza introspección en tiempo de ejecución en la base de datos)
      • Migración limpia entre versiones de esquema (al menos en la versión 1.6 beta)
      • Puede generar modelos PHP 5.3 (es decir, espacios de nombres)
      • Fácil de encadenar muchas cosas en una sola consulta de base de datos con useXxxmétodos como métodos. (Ver el video "finalización del código" arriba)
    • Contras
      • Requiere un paso de construcción adicional, es decir, construir las clases modelo.
      • El código generado debe reconstruirse cada vez que se cambia la versión de Propel, se cambia una configuración o se cambia el esquema. Esto puede no ser intuitivo para algunos y se pierden los métodos personalizados aplicados al modelo. (¿Creo?) - No es cierto; los métodos personalizados no se pierden porque la clase generada es una clase base; Propel proporciona una clase de entidad específicamente para extensión.
      • Algunas características útiles (es decir, comportamiento de versión, migraciones de esquema) están en estado beta.
  • Doctrina
    • Pros
      • Más popular
      • Doctrine Query Language puede expresar relaciones entre datos potencialmente más complicadas de lo que es posible con la estrategia ActiveRecord de Propel.
      • Es más fácil agregar comportamientos reutilizables en comparación con Propel.
      • Los comentarios basados ​​en DocBlock para construir el esquema están incrustados en el PHP real en lugar de un archivo XML separado.
      • Utiliza espacios de nombres PHP 5.3 en todas partes
    • Contras
      • Requiere aprender un lenguaje de programación completamente nuevo (Doctrine Query Language)
      • Implementado en términos de "métodos mágicos" en varios lugares, lo que hace que el autocompletado IDE no tenga valor.
      • Requiere introspección de la base de datos y, por lo tanto, es un poco más lento que Propel de forma predeterminada; el almacenamiento en caché puede eliminar esto, pero el almacenamiento en caché agrega una complejidad considerable.
      • Se incluyen menos comportamientos en la base de código central. Varias características que Propel proporciona de forma inmediata (como el Conjunto anidado) están disponibles solo a través de extensiones.
      • Freakin 'ENORME :)

Sin embargo, esto lo he deducido solo leyendo la documentación disponible para ambas herramientas; en realidad, aún no he construido nada.

Sin embargo, me gustaría saber de aquellos que han usado ambas herramientas, para compartir su experiencia sobre los pros / contras de cada biblioteca, y cuál es su recomendación en este momento :)

Billy ONeal
fuente
¿De qué versión de Doctrine estás hablando? v2 y v1.2 son polos separados.
Orbling
1
@Orbling: ¿Leíste el título o el cuerpo de la pregunta? Leerlos de nuevo :)
Billy ONeal
@Billy ONeal: Buen punto. Doctrine2 tiene comportamientos eliminados casi por completo del Core, por lo que pensé que tal vez habías estado hablando de v1.2.
Orbling
@Orbling: Ah, eso tiene sentido. Por otro lado, proporciona equivalentes a "comportamientos", simplemente no los llama así.
Billy ONeal
@Billy ONeal: en realidad no lo hace, puede implementarlos usted mismo de una manera bastante fácil, o puede obtener complementos de terceros. Pero no es como Doctrine1 o Propel.
Orbling

Respuestas:

15

A pesar de la tendencia actual de recomendar Doctrine, debo decir lo contrario. Tenga en cuenta que también, mis preferencias personales están orientadas a mis experiencias personales, pero cómo dijo @Dan, ambos son muy potentes.

No me gusta Doctrine por varias de las razones que dijiste antes, como el tamaño y los métodos mágicos son los que rompen el trato conmigo. Entonces, uso Propel , ¿por qué? principalmente porque es simplicidad y porque lo simple en el desarrollo de software es bueno . Mi creencia personal es que ser codicioso con los diseños es malo.

Con Propel, he logrado implementar una implementación de patrón de repositorio para mis propios sistemas, y funciona muy bien, sin mencionar el rendimiento de Propel, que es uno de los ORM más rápidos que he visto.

Entonces, mi respuesta básica es Propel , porque logra un buen software con menos código y le permite al IDE proporcionarle un buen intellisense sin perder el punto del software ORM que se conecta a la base de datos y lo hace bien ...

Espero poder ayudar

David Conde
fuente
Estuve usando Doctrine por un año. Probé Kohana, Laravel Eloquent, me gustan sus campos públicos porque realmente odio a los captadores y setters (prefiero el descriptor de acceso a la propiedad: P). Después de ver la palabra 'IDE amigable' en Propel, decidí probar Propel esta noche.
Zorji
11

Su información sobre Doctrine 2 es incorrecta ...

  • DQL es prácticamente SQL, así que no hay mucho que aprender.
  • Doctrine 2 no usa ninguna 'magia' (solo lo que esperarías en cualquier biblioteca PHP actualizada).
  • Doctrine 2 no realiza activamente la introspección de la base de datos ... el mapeo se almacena en sus entidades / archivos de mapeo y supone que su base de datos se ajustará a eso.
  • El almacenamiento en caché es apenas una "complejidad considerable".
  • Doctrine 2 no tiene 'comportamientos' listos para usar

No he usado Propel antes, pero Doctrine 2 es mucho más nuevo y tiene una base de código de muy alta calidad. Pero parece que Propel usa Active Record, Doctrine 2 usa el patrón Data Mapper.

La desventaja de que Doctrine 2 es más reciente es la falta de ejemplos de terceros, pero se está acumulando rápidamente.

Recomiendo Doctrine 2 ...

De altura baja
fuente
Si no ha usado Propel antes, entonces no tengo más remedio que rechazar esto debido a que es FUD. En cuanto al comentario "Magic", lo que quiero decir es que se basa en métodos mágicos de PHP como __gety __set(que es cierto) en lugar de métodos reales.
Billy ONeal
1
Ok por el voto negativo ... ¿Pero dónde usa Doctrine 2 métodos mágicos? Aparte de los métodos find * de DocumentRepository (__call), pero eso no es un problema porque es una forma más agradable de consultar ... siempre perderá el autocompletado IDE. Si desea ActiveRecord, use Propel. Si desea Data Mapper, use Doctrine 2.
Cobby
2
Propel no introspecta la base de datos en tiempo de ejecución gracias a la generación de código.
William Durand
El elemento de viñeta n. ° 1 no es del todo correcto, DQL no es "bastante" como SQL. DQL depende del hecho de que está haciendo referencia a objetos de modelo que Doctrine debe tener en cuenta, y existen algunas complicaciones si son necesarias combinaciones más complejas.
Mike Purcell
2
DQL es un dialecto de SQL, ¿cómo eso no lo hace "bastante" como SQL? Sí, la semántica del lenguaje es un poco diferente (objetos versus tablas), pero en última instancia, DQL es un lenguaje para consultar datos estructurados, que simplemente se representan como objetos, no tablas, también conocido como SQL.
Cobby
3

Según sus comentarios, parece que está intentando elegir Propel o Doctrine para reemplazar o satisfacer su necesidad de un ORM en una aplicación heredada.

Dicho esto, creo que es importante no perder de vista el hecho de que cambiar a cualquiera de ellos podría ser una gran mejora para su aplicación. Entonces, no hay una verdadera respuesta incorrecta.

Por lo tanto, la solución que elija depende en gran medida de sus preferencias según sus respuestas a las siguientes preguntas:

  1. ¿Cuál se integra mejor en su solución actual?
  2. ¿Qué API prefieres?
  3. ¿A cuál preferirías contribuir? (parches, documentación, informes de errores, etc.)

Personalmente, recomendaría Doctrine 2 debido a su comunidad, documentación y arquitectura.

Christopher Manning
fuente
1
Sin embargo, estoy buscando una comparación entre ellos aquí. (¿Por qué cuál preferiría contribuir? No quiero contribuir a ninguno de ellos, ¡quiero usar la biblioteca, no escribirla!)). Estás diciendo que Doctrine 2 tiene una buena comunidad, documentos y arquitectura; en cuanto a arquitectura, sí, es DataMapper. Docs wise No estoy seguro de estar de acuerdo, ambos proyectos parecen tener buenos documentos. No he visto mucha comunidad usando ninguno de los sistemas. ¿Te importaría explicar qué quieres decir con estas cosas?
Billy ONeal
2
Oh, ¿te gusta el documento de Doctrine? ¿Leíste el de Propel? Y sí, la comunidad de Doctrine es agradable, pero eche un vistazo al repositorio de ODM, muchas relaciones públicas ni siquiera se comentan, fusionan ni rechazan ... Mire la línea de tiempo de Propel, la comunidad está realmente activa;)
William Durand
3

Te recomiendo Propel porque está bien integrado, es rápido y potente. Generar código es mejor que cargar clases en tiempo de ejecución, facilita los pasos de depuración y le muestra lo que ha creado. Entonces el paso de compilación no es un problema.

Doctrine2 no tiene comportamientos oficiales, y el patrón de diseño de DataMapper es genial pero difícil de usar en la vida real. Ah, y DQL es un lenguaje doloroso, pero aún antiguo para aprender ...

Si quiere pensar con objetos (sin DQL / SQL / lo que sea), elija Propel.

Doctrine2 es parte de Symfony2 de facto pero las cosas se moverán muy pronto, mira el último artículo de Fabien Potencier.

Saludos, William

William Durand
fuente
, comencé con Propel hace 2 años con symfony1. luego tuve que cambiar a Doctrine2 para symfony2. Feliz de volver a Propel. ¡Felicidades!
Bhanu Krishnan
2

Ambos son muy buenos. Hay algunos casos extremos en los que uno puede hacer algo, o hacer algo mejor, que el otro. Dondequiera que haya tenido problemas, se debió más a mi falta de conocimiento que a algo que no pudieron hacer.

Esto significa que la documentación y el soporte son más importantes que la capacidad intrínseca del código. ¿Conoces a alguien que pueda ayudarte cuando tengas problemas? ¿Qué tan bien te llevas con la documentación? ¿Uno de ellos simplemente se 'siente' más natural para usted?

Dan golpes
fuente
2

Elegí Propel 1.63 para una gran aplicación mysql heredada (más o menos 200 tablas). Los factores aquí incluidos incluyen: soporte IDE que permite a los nuevos desarrolladores encontrar su camino fácilmente con la finalización del código; soporte de esquema de base de datos cruzada, rendimiento mejor soporte nativo para enumeraciones y el uso de varios comportamientos. En realidad, comencé con Doctrine, ya que Symfony2 tenía el mejor soporte, pero una vez que Propel mejoró enormemente su soporte con Symfony (la próxima plataforma a la que eventualmente migraré) cambié debido al mejor manejo de los problemas anteriores. Sin remordimientos en absoluto Propel es un ganador decisivo.

Michael Heward
fuente