PHP Orm: Doctrina vs Impulsar


Estoy comenzando un nuevo proyecto con symfony que se integra fácilmente con Doctrine y Propel, pero por supuesto necesito hacer una elección.... Me preguntaba si la gente más experimentada por ahí tiene pros y/o contras generales para ir con cualquiera de estos dos?

Muchas Gracias.

EDITAR: Gracias por todas las respuestas, cosas útiles. No hay una respuesta verdaderamente correcta a esta pregunta, así que solo marcaré como aprobado el que obtuvo el los votos más populares.

Author: Mohammad Ali Akbari, 2010-01-14

10 answers

Yo iría con la Doctrina. Me parece que es un proyecto mucho más activo y siendo el default predeterminado para symfony es mejor soportado (aunque oficialmente los OR se consideran iguales).

Además, me gusta más la forma en que trabaja con consultas (DQL en lugar de Criterios):

<?php
// Propel
$c = new Criteria();
$c->add(ExamplePeer::ID, 20);
$items = ExamplePeer::doSelectJoinFoobar($c);

// Doctrine
$items = Doctrine_Query::create()
       ->from('Example e')
       ->leftJoin('e.Foobar')
       ->where('e.id = ?', 20)
       ->execute();
?>

(La implementación de la Doctrina es mucho más intuitiva para mí).

Además, realmente prefiero la forma en que manejas las relaciones en la Doctrina.

Creo que esta página de la Doctrina vale la pena leer la documentación: http://www.doctrine-project.org/documentation/manual/1_2/en/introduction:doctrine-explained

Para resumir: Si estuviera comenzando un nuevo proyecto o tuviera que elegir entre aprender Doctrina y Propulsar, iría a la Doctrina cualquier día.

 73
Author: phidah,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-14 06:51:06

Estoy sesgado, ya que ayudo un poco en la próxima versión de Propel, pero debes considerar que Propel fue el primer OR disponible, luego se retrasó un poco cuando se creó Doctrine, pero ahora tiene un desarrollo activo nuevamente. Symfony 1.3 / 1.4 viene con Propel 1.4, donde la mayoría de las comparaciones se detienen en Propel 1.3. Además, la próxima versión de Propel (1.5) contendrá muchas mejoras, especialmente en la creación de sus Criterios (lo que resulta en menos código para escribir).

Me gusta Propulsar porque parece ser menos complejo que Doctrine: la mayor parte del código está en las pocas clases generadas, mientras que Doctrine ha dividido la funcionalidad en muchas clases. Me gusta tener una buena comprensión de las bibliotecas que estoy utilizando (no demasiado "magia"), pero por supuesto, tengo más experiencia con Propel, por lo que tal vez la Doctrina no es tan complicada detrás de las escenas. Algunos dicen que Propulsar es más rápido, pero usted debe comprobar esto por sí mismo, y considerar si esto supera otras diferencias.

Tal vez también debe considerar la disponibilidad de plugins de Symfony para los diferentes frameworks. Creo que Propel tiene una ventaja aquí, pero no se cuántos de los plugins listados están todavía actualizados con la última versión de Symfony.

 39
Author: Jan Fabry,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-14 09:23:59

Todo se reduce a la preferencia personal. Uso Propel porque (entre otras cosas) me gusta el hecho de que todo tiene su propio método concreto getter & setter. En la doctrina, este no es el caso.

Propulsar:

$person->setName('Derek');
echo $person->getName();

Doctrina:

$person->name = 'Derek';
echo $person->name;

La razón por la que me gusta tener getters y setters es que puedo poner todo tipo de lógica en ellos, si lo necesito. Pero esa es mi preferencia personal.

También debo agregar que aunque Propel se movía lentamente en el pasado, ahora lo hace bajo desarrollo activo de nuevo. Ha lanzado varias versiones nuevas en los últimos meses. La versión más reciente de Propel incluye una "interfaz de consulta fluida" similar a la de Doctrine, por lo que ya no tiene que usar Criterios si no quiere.

 21
Author: lo_fye,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-14 19:59:36

Cabe señalar La Doctrina 2 está actualmente en desarrollo liberado [ed] y funciones casi completamente diferentes de la versión estable actual de la Doctrina 1. Se basa en el patrón de Mapeador de datos en lugar de Active Record, y utiliza un 'entity manager' para manejar la lógica de persistencia. Cuando se publique, tendrá un parecido más cercano al Hibernado de Java (Doctrine 1 se parece más al ActiveRecord de Rails).

He estado desarrollando con la versión alfa de la Doctrina 2, y debo decir que está por encima de la Doctrina 1 (solo mi opinión, y nunca he usado Propel). Es muy probable que la comunidad Doctrine se mueva hacia ella cuando se publique.

Les animo a que echen un vistazo a Doctrine, pero si prefieren el estilo de Registro Activo que Propel y Doctrine usan ahora, es posible que quieran quedarse con Propel.

 20
Author: Bryan M.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-01 08:48:58

Las dos referencias están algo desactualizadas por lo que, sin embargo, cubre algunas generalidades, básicamente tendría que evaluar su experiencia con el framework como tal, un inconveniente importante de doctrine es la incapacidad de tener un IDE que le permita autocodificar en que propel es un ganador, las curvas de aprendizaje propel y doctrine son muy diferentes, es más fácil de propulsar, si su proyecto necesitará administrar modelos de datos complejos usa doctrine, si desea trabajar rápidamente con un OR que esté mejor documentado y encontrar más soporte en Propulsar los usos de Internet, es mucho más maduro y creo que el más utilizado.

Http://propel.posterous.com/propel-141-is-out

 5
Author: Mauricio Herrán,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-14 06:35:38

Sugiero usar propel 1.6 que es mejor para la función de autocompletar del IDE.

 5
Author: petkopara,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-28 09:36:10

No soy un usuario de PHP 5 sin marco OR, pero aquí hay algunas buenas publicaciones de comparación (en caso de que aún no las haya visto):

Http://codeutopia.net/blog/2009/05/16/doctrine-vs-propel-2009-update /

Http://trac.symfony-project.org/wiki/ComparingPropelAndDoctrine

Tanto conlusion favorito hacia Doctrine como una nueva generación de Sym para Symfony.

 2
Author: Trav L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-01-14 06:18:48

Sugeriría usar el complemento DbFinder. En realidad, este es un plugin muy potente que admite ambos, y es bastante potente. En realidad me gusta usarlo mejor que cualquiera.

 1
Author: Mike Crowe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-07 01:51:19

Después de usar ambos durante varios años, prefiero Propel 2 a Doctrine simplemente basado en cómo construyes tu lógica de consulta. La doctrina es tan profunda como puede obtener y la gestión de muchos aspectos de la misma coinciden con ese nivel de profundidad. Propel I Feel tiene una forma más fluida y orientada a objetos de construir y gestionar las interacciones de consulta.

Para mí esto llevó a menos código en el modelo y más estructuras alrededor de cómo la lógica puede/será procesada. Esto resultó en la construcción de muchos interacciones como funcionalidad común. (Después de todo el 90% de lo que va a hacer con una base de datos sólo va a ser algún grado de operación crud.)

Al final, ambos son poderosos, manejables y harán el trabajo. Mis proyectos personales e interés utilizan Propel Prop 2 y proyectos futuros, si todavía están escritos en PHP irán por esa ruta.

He estado usando ambos a diario durante los últimos 3-4 años.

 0
Author: Ryan Rentfro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-05 20:35:11

Si no me equivoco, ambosMs usan esquemas basados en XML, y crear estas definiciones de esquema es bastante engorroso. Si necesita un esquema simple basado en PHP con estilo fluido. Puede probar LazyRecord https://github.com/c9s/LazyRecord admite la migración automática y los generadores de scripts de actualización/degradación. Y todos los archivos de clase se generan estáticamente sin costo de tiempo de ejecución.

 -3
Author: c9s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-20 03:55:20