Devo escolher Doutrina 2 ou Propel 1.5 / 1.6, e por quê? [fechadas]

30

Gostaria de ouvir aqueles que usaram a Doutrina 2 (ou mais recente) e o Propel 1.5 (ou mais recente). A maioria das comparações entre esses dois mapeadores relacionais de objetos é baseada em versões antigas - Doutrina 1 versus Propel 1.3 / 1.4, e os dois ORMs passaram por reformulações significativas em suas revisões recentes. Por exemplo, a maioria das críticas ao Propel parece estar centrada nas classes "ModelName Peer ", que são preteridas na versão 1.5 em qualquer caso.

Aqui está o que acumulei até agora (e tentei tornar essa lista o mais equilibrada possível ...):

  • Impulsionar
    • Prós
      • Extremamente compatível com IDE, porque o código real é gerado, em vez de confiar nos métodos mágicos do PHP. Isso significa que recursos do IDE, como conclusão de código, são realmente úteis.
      • Rápido (em termos de uso do banco de dados - nenhuma introspecção de tempo de execução é feita no banco de dados)
      • Migração limpa entre versões de esquema (pelo menos na versão 1.6 beta)
      • Pode gerar modelos PHP 5.3 (por exemplo, namespaces)
      • Fácil de encadear muitas coisas em uma única consulta ao banco de dados com useXxxmétodos como métodos. (Veja o vídeo "conclusão do código" acima)
    • Contras
      • Requer uma etapa de compilação extra, ou seja, a construção das classes de modelo.
      • O código gerado precisa ser reconstruído sempre que a versão do Propel for alterada, uma configuração for alterada ou o esquema for alterado. Isso pode não ser intuitivo para alguns métodos perdidos e personalizados aplicados ao modelo. (Eu acho?) - Não é verdade; métodos personalizados não são perdidos porque a classe gerada é uma classe base; O Propel fornece uma classe de entidade especificamente para extensão.
      • Alguns recursos úteis (ou seja, comportamento da versão, migrações de esquema) estão no status beta.
  • Doutrina
    • Prós
      • Mais popular
      • A linguagem de consulta da doutrina pode expressar relacionamentos potencialmente mais complicados entre os dados do que facilmente possível com a estratégia ActiveRecord da Propel.
      • Mais fácil adicionar comportamentos reutilizáveis ​​quando comparados ao Propel.
      • Os comentários baseados no DocBlock para criar o esquema são incorporados no PHP real, em vez de em um arquivo XML separado.
      • Usa namespaces PHP 5.3 em todos os lugares
    • Contras
      • Requer o aprendizado de uma linguagem de programação totalmente nova (Doctrine Query Language)
      • Implementado em termos de "métodos mágicos" em vários lugares, tornando o preenchimento automático do IDE inútil.
      • Requer introspecção de banco de dados e, portanto, é um pouco mais lento que o Propel por padrão; o cache pode remover isso, mas o cache adiciona uma complexidade considerável.
      • Menos comportamentos estão incluídos na base de código principal. Vários recursos fornecidos pelo Propel (como o Conjunto aninhado) estão disponíveis apenas através de extensões.
      • Freakin 'ENORME :)

Embora eu tenha adquirido isso apenas através da leitura da documentação disponível para as duas ferramentas - ainda não construí nada.

Eu gostaria de ouvir aqueles que usaram as duas ferramentas, para compartilhar sua experiência sobre os prós / contras de cada biblioteca e qual é a recomendação deles neste momento :)

Billy ONeal
fonte
De que versão do Doctrine você está falando? v2 e v1.2 são pólos separados.
Orbling 17/02
1
@Orbling: Você leu o título ou o corpo da pergunta? Leia-os novamente :)
Billy ONeal
@ Billy ONeal: Bom ponto. O Doctrine2 tem comportamentos removidos praticamente do Core, então pensei que você estivesse falando da v1.2.
Orbling
@Orbling: Ah, isso faz sentido. Por outro lado, fornece equivalentes a "comportamentos" - simplesmente não os chama assim.
Billy ONeal
@ Billy ONeal: Na verdade, você não pode implementá-los de maneira bastante fácil ou pode obter plug-ins de terceiros. Mas não é como Doutrina1 ou Propel.
Orbling 17/02

Respostas:

15

Apesar da tendência atual de recomendar Doutrina, preciso dizer o contrário. Lembre-se também de que minhas preferências pessoais são orientadas para minhas experiências pessoais, mas como @Dan disse, ambas são muito potentes.

Eu não gosto de Doutrina por várias das razões que você declarou antes, como o tamanho e os métodos mágicos inteiros são os problemas comigo. Então, eu uso o Propel , por quê? principalmente porque é simples e porque simples no desenvolvimento de software é bom . Minha opinião pessoal é que ficar ganancioso com os projetos é ruim.

Usando o Propel, consegui implementar uma implementação de padrão de repositório para meus próprios sistemas e funciona muito bem, sem mencionar o desempenho do Propel, que é um dos ORM mais rápidos que já vi.

Portanto, minha resposta básica é a Propel , porque ela realiza um bom software com menos código e capacita o IDE a fornecer um bom senso de inteligência sem perder o objetivo do software ORM que está se conectando ao banco de dados e fazendo com que seja agradável ...

Espero poder ajudar

David Conde
fonte
Eu estava usando Doctrine por um ano. Eu tentei Kohana, Laravel Eloquent, eu gosto dos campos públicos porque eu realmente odeio getters e setters (eu prefiro acessador de propriedades: P). Depois que vi a palavra 'IDE friendly' no Propel, decidi experimentar o Propel hoje à noite.
Zorji
11

Suas informações sobre Doutrina 2 estão erradas ...

  • DQL é praticamente SQL, portanto não há muito o que aprender.
  • A Doutrina 2 não usa nenhuma 'mágica' (apenas o que você esperaria em qualquer biblioteca PHP atualizada).
  • A Doutrina 2 não faz ativamente a introspecção de banco de dados ... o mapeamento é armazenado em suas entidades / arquivos de mapeamento e assume que seu banco de dados se ajustará a isso.
  • O armazenamento em cache dificilmente é uma "complexidade considerável".
  • A doutrina 2 não tem 'comportamentos' prontos para uso

Eu nunca usei o Propel antes, mas o Doctrine 2 é muito mais recente e possui uma base de código de alta qualidade. Mas parece que o Propel usa o Active Record, o Doctrine 2 usa o padrão Data Mapper.

A desvantagem de Doctrine 2 ser mais recente é a falta de exemplos de terceiros, mas está crescendo rapidamente.

Eu recomendo a Doutrina 2 ...

Cobby
fonte
Se você não usou o Propel antes, não tenho outra opção a não ser diminuir o voto devido ao fato de ser FUD. Quanto ao comentário "Magic", o que quero dizer é que ele é baseado em métodos mágicos do PHP como __gete __set(o que é verdade) e não em métodos reais.
precisa
1
Aprovação para o voto negativo ... Mas onde Doctrine 2 usa métodos mágicos? Além dos métodos find * do DocumentRepository (__call), mas isso não é um problema, porque é apenas uma maneira mais agradável de consultar ... você sempre perderá o preenchimento automático do IDE. Se você deseja ActiveRecord, use Propel. Se você deseja o Data Mapper, use a Doutrina 2.
Cobby
2
O Propel não inspeciona o banco de dados em tempo de execução, graças à geração de código.
William Durand
O item 1 do marcador não está totalmente correto, o DQL não é "praticamente" como o SQL. O DQL depende do fato de você estar referenciando objetos de modelo dos quais o Doctrine deve estar ciente, e existem algumas complicações se junções mais complexas forem necessárias.
Mike Purcell
2
DQL é um dialeto do SQL, como isso não o torna "praticamente" como o SQL? Sim, a semântica da linguagem é um pouco diferente (objetos versus tabelas), mas, em última análise, o DQL é uma linguagem para consulta de dados estruturados - que passou a ser representada como objetos e não como tabelas - também conhecida como SQL.
Cobby
3

A partir dos seus comentários, parece que você está tentando escolher o Propel ou o Doctrine para substituir ou atender à sua necessidade de um ORM em um aplicativo herdado.

Dito isto, acho importante não perder de vista o fato de que mudar para um deles pode ser uma grande melhoria para o seu aplicativo. Portanto, não há resposta realmente errada.

Portanto, a solução que você escolhe depende muito das suas preferências, com base nas suas respostas às seguintes perguntas:

  1. Qual se integra melhor à sua solução atual?
  2. Qual API você prefere?
  3. Com quem você prefere contribuir? (patches, documentação, relatórios de erros, etc ...)

Pessoalmente, eu recomendaria o Doctrine 2 por causa de sua comunidade, documentação e arquitetura.

Christopher Manning
fonte
1
Estou procurando uma comparação entre eles aqui. (Por que qual deles eu preferiria contribuir? Não quero contribuir com nenhum deles - quero usar a biblioteca, não escrevê-la!;)). Você está dizendo que o Doctrine 2 tem boa comunidade, documentos e arquitetura - em termos de arquitetura, sim, é o DataMapper. Docs wise, eu não tenho certeza se eu concordo - ambos os projetos parecem ter bons documentos. Não vi muita comunidade usando nenhum desses sistemas. Você gostaria de elaborar o que você quer dizer com essas coisas?
Billy ONeal
2
Oh, você gosta do documento de Doutrina? Você leu o Propel? E sim, a comunidade Doctrine é legal, mas dê uma olhada no repositório ODM, muitos PRs nem sequer são comentados, mesclados ou rejeitados ... Veja a linha do tempo do Propel, a comunidade está realmente ativa;)
William Durand
3

Eu recomendo que você Propel, porque é bem integrado, rápido e poderoso. Gerar código é melhor do que carregar classes no tempo de execução, facilita as etapas de depuração e mostra o que você criou. Portanto, a etapa de construção não é um problema.

O Doctrine2 não possui comportamentos oficiais, e o padrão de design do DataMapper é legal, mas difícil de usar na vida real. Ah, e DQL é uma dor, mas aborda a linguagem para aprender ...

Se você quiser pensar com objetos (sem DQL / SQL / o que seja), escolha Propel.

A Doutrina 2 faz parte do Symfony2 de fato, mas as coisas vão mudar muito em breve, veja o último artigo sobre Fabien Potencier.

Cheers, William

William Durand
fonte
, comecei com o Propel há 2 anos com o symfony1. depois tive que mudar para o Doctrine2 para o symfony2. Feliz em voltar a Propel.Cheers!
Bhanu Krishnan
2

Ambos são muito bons. Existem alguns casos extremos em que um pode fazer algo ou fazer algo melhor do que o outro. Onde quer que eu tenha tido problemas com ambos, isso se deve mais à minha falta de conhecimento do que a algo que eles não podem fazer.

Isso significa que a documentação e o suporte são mais importantes que a capacidade intrínseca do código. Você conhece alguém que possa ajudá-lo quando tiver problemas? Você se dá bem com a documentação? Um deles simplesmente 'parece' mais natural para você?

Dan Blows
fonte
2

Eu escolhi o Propel 1.63 para um grande aplicativo mysql legado (200 tabelas ou mais) - os fatores aqui incluídos: suporte a IDE que permite que novos desenvolvedores encontrem seu caminho facilmente com a conclusão de código; suporte a esquema de banco de dados cruzado, desempenho; melhor suporte nativo para enums e o uso de vários comportamentos. Na verdade, comecei com o Doctrine, já que este era o melhor suporte do Symfony2, mas uma vez que a Propel melhorou bastante o suporte ao Symfony (a próxima plataforma para a qual eventualmente migrarei), mudei devido ao melhor tratamento dos problemas acima. Sem arrependimentos Propel é um vencedor decisivo.

Michael Heward
fonte