Dovrei scegliere Doctrine 2 o Propel 1.5 / 1.6 e perché? [chiuso]


30

Mi piacerebbe avere notizie da coloro che hanno usato Doctrine 2 (o successive) e Propel 1.5 (o successive). La maggior parte dei confronti tra questi due mappatori relazionali di oggetti si basano su vecchie versioni - Doctrine 1 contro Propel 1.3 / 1.4 ed entrambi gli ORM hanno subito riprogettazioni significative nelle loro recenti revisioni. Ad esempio, la maggior parte delle critiche a Propel sembra concentrarsi sulle classi "ModelName Peer ", che sono comunque deprecate in 1.5.

Ecco cosa ho accumulato finora (e ho cercato di rendere questo elenco il più equilibrato possibile ...):

  • Propel
    • Professionisti
      • Estremamente intuitivo per IDE, poiché viene generato il codice effettivo, anziché fare affidamento sui metodi magici PHP. Ciò significa che le funzionalità IDE come il completamento del codice sono effettivamente utili.
      • Veloce (in termini di utilizzo del database - nessuna introspezione di runtime viene eseguita sul database)
      • Migrazione pulita tra le versioni dello schema (almeno nella 1.6 beta)
      • Può generare modelli PHP 5.3 (es. Spazi dei nomi)
      • Facile concatenare molte cose in una singola query di database con useXxxmetodi come i metodi. (Vedi il video "completamento del codice" sopra)
    • Contro
      • Richiede un ulteriore passaggio di creazione, ovvero la creazione delle classi del modello.
      • Il codice generato deve essere ricostruito ogni volta che la versione di Propel viene modificata, un'impostazione viene modificata o lo schema cambia. Ciò potrebbe non essere intuitivo per alcuni e i metodi personalizzati applicati al modello vanno persi. (Penso?) - Non è vero; i metodi personalizzati non vanno persi perché la classe generata è una classe base; Propel fornisce una classe di entità specificamente per l'estensione.
      • Alcune funzioni utili (ad es. Comportamento della versione, migrazioni dello schema) sono in stato beta.
  • Dottrina
    • Professionisti
      • Più popolare
      • Doctrine Query Language può esprimere relazioni potenzialmente più complicate tra i dati di quanto sia facilmente possibile con la strategia ActiveRecord di Propel.
      • È più facile aggiungere comportamenti riutilizzabili rispetto a Propel.
      • I commenti basati su DocBlock per la creazione dello schema sono incorporati nel PHP effettivo anziché in un file XML separato.
      • Utilizza PHP 5.3 Spazi dei nomi ovunque
    • Contro
      • Richiede l'apprendimento di un linguaggio di programmazione completamente nuovo (Doctrine Query Language)
      • Implementato in termini di "metodi magici" in diversi punti, rendendo inutile il completamento automatico dell'IDE.
      • Richiede introspezione del database e quindi è leggermente più lento di Propel per impostazione predefinita; la memorizzazione nella cache può rimuovere ciò, ma la memorizzazione nella cache aggiunge una notevole complessità.
      • Meno comportamenti sono inclusi nella base di codice di base. Diverse funzionalità fornite da Propel (come il set nidificato) sono disponibili solo tramite le estensioni.
      • Freakin 'ENORME :)

Questo l'ho raccolto anche solo leggendo la documentazione disponibile per entrambi gli strumenti: non ho ancora creato nulla.

Mi piacerebbe avere notizie da coloro che hanno utilizzato entrambi gli strumenti, per condividere la loro esperienza sui pro / contro di ciascuna libreria e su quale sia la loro raccomandazione a questo punto :)


Di quale versione di Doctrine stai parlando? v2 e v1.2 sono a parte i poli.
Orbling

1
@Orbling: hai letto il titolo o il corpo della domanda?
Rileggili

@Billy ONeal: buon punto. Doctrine2 ha rimosso i comportamenti quasi interamente dal Core, quindi ho pensato che potresti aver parlato della v1.2 invece.
Orbling

@Orbling: Ah, ha senso. D'altra parte fornisce equivalenti a "comportamenti" - semplicemente non li chiama così.
Billy ONeal,

@Billy ONeal: In realtà no, puoi implementarli tu stesso in un modo abbastanza semplice, oppure puoi ottenere plugin di terze parti. Ma non è come Doctrine1 o Propel.
Orbling

Risposte:


15

Disputa l'attuale tendenza a raccomandare Dottrina, devo dire il contrario. Tieni presente che anche le mie preferenze personali sono orientate alle mie esperienze personali, ma come ha detto @Dan, sono entrambe molto potenti.

Non mi piace la Dottrina per molte delle ragioni che hai affermato in precedenza, come le dimensioni e l'intero metodo magico che mi fanno perdere la testa . Quindi, io uso Propel , perché? soprattutto perché è la semplicità, e perché semplice nello sviluppo di software è buona . La mia convinzione personale è che diventare avidi con i disegni è male.

Usando Propel, sono riuscito a implementare un'implementazione del modello di repository per i miei sistemi, e funziona davvero bene, per non parlare delle prestazioni di Propel, che è uno degli ORM più veloci che abbia mai visto.

Quindi, la mia risposta di base è Propel , perché realizza un buon software con meno codice e autorizza l'IDE a fornire un buon intellisense senza perdere il punto del software ORM che si collega al database e lo fa in modo piacevole ...

Spero di poterti aiutare


Stavo usando Doctrine per un anno. Ho provato Kohana, Laravel Eloquent, mi piacciono i loro campi pubblici perché odio davvero i getter e i setter (preferisco l'accesso alla proprietà: P). Dopo aver visto la parola "IDE friendly" in Propel, ho deciso di provare Propel stasera.
Zorji,

11

Le tue informazioni su Doctrine 2 sono errate ...

  • DQL è praticamente SQL, quindi non c'è molto da imparare.
  • Doctrine 2 non usa alcun "magico" (solo ciò che ti aspetteresti in nessuna libreria PHP aggiornata).
  • Doctrine 2 non esegue attivamente l'introspezione del database ... la mappatura viene archiviata nelle entità / file di mappatura e presuppone che il database si adatti a questo.
  • La memorizzazione nella cache non è certo "notevole complessità".
  • Doctrine 2 non ha "comportamenti" pronti all'uso

Non ho mai usato Propel prima, ma Doctrine 2 è molto più recente e ha una base di codice di altissima qualità. Ma sembra che Propel usi Active Record, Doctrine 2 usa il modello Data Mapper.

L'aspetto negativo di Doctrine 2 è la mancanza di esempi di terze parti, ma si sta rapidamente sviluppando.

Raccomando Doctrine 2 ...


Se non hai mai usato Propel prima di allora non ho altra scelta che sottovalutare questo perché FUD. Per quanto riguarda il commento "Magia", ciò che intendo è che si basa su metodi di magia PHP come __gete __set(che è vero) piuttosto che su metodi reali.
Billy ONeal,

1
Ok per il voto negativo ... Ma dove Doctrine 2 usa metodi magici? A parte i metodi find * di DocumentRepository (__call), ma questo non è un problema perché è solo un modo migliore di interrogare ... perderai sempre il completamento automatico IDE. Se vuoi ActiveRecord usa Propel. Se si desidera Data Mapper, utilizzare Doctrine 2.
Cobby

2
Propel non introspetta il database in fase di esecuzione grazie alla generazione del codice.
William Durand,

Il punto elenco 1 non è del tutto corretto, DQL non è "praticamente" come SQL. DQL dipende dal fatto che si fa riferimento a oggetti modello di cui Doctrine deve essere a conoscenza, e ci sono alcune complicazioni se sono necessari join più complessi.
Mike Purcell,

2
DQL è un dialetto di SQL, in che modo non lo rende "praticamente" come SQL? Sì, la semantica del linguaggio è un po 'diversa (oggetti contro tabelle), ma alla fine DQL è il linguaggio per interrogare i dati strutturati - che è capitato di essere rappresentato come oggetti non tabelle - aka SQL.
Cobby,

3

Dai tuoi commenti, sembra che tu stia provando a scegliere Propel o Doctrine per sostituire o soddisfare la tua necessità di un ORM in un'applicazione legacy.

Detto questo, penso che sia importante non perdere di vista il fatto che passare a uno dei due potrebbe essere un grande miglioramento per la tua applicazione. Quindi, non c'è una vera risposta sbagliata.

Pertanto, la soluzione che scegli dipende in gran parte dalle tue preferenze in base alle risposte alle seguenti domande:

  1. Quale si integra meglio nella tua attuale soluzione?
  2. Quale API preferisci?
  3. A quale preferiresti contribuire? (patch, documentazione, segnalazioni di bug, ecc ...)

Personalmente, consiglierei Doctrine 2 per la sua comunità, documentazione e architettura.


1
Sto cercando un confronto tra loro qui però. (Perché quale preferirei contribuire alla questione? Non voglio contribuire a nessuno di essi - Voglio usare la biblioteca, non scriverla!;)). Stai dicendo che Doctrine 2 ha una buona community, documenti e architettura - per quanto riguarda l'architettura, sì, è DataMapper. Per quanto riguarda i documenti, non sono sicuro di essere d'accordo: entrambi i progetti sembrano avere buoni documenti. Non ho visto gran parte di una comunità che utilizzava entrambi i sistemi. Ti andrebbe di approfondire cosa intendi con queste cose?
Billy ONeal,

2
Oh, ti piace il Doctrine Doc? Hai letto quello di Propel? E sì, la community di Doctrine è carina, ma dai un'occhiata al repository ODM, molti PR non sono nemmeno commentati, né uniti né respinti ... Guarda la cronologia di Propel, la community è davvero attiva;)
William Durand,

3

Ti consiglio Propel perché è ben integrato, veloce e potente. Generare codice è meglio che caricare classi in fase di runtime, facilita i passaggi di debug e ti mostra cosa hai creato. Quindi il passo di costruzione non è un problema.

Doctrine2 non ha comportamenti ufficiali e il modello di progettazione di DataMapper è bello ma difficile da usare nella vita reale. Oh e DQL è un linguaggio doloroso, ma abortivo per imparare ...

Se vuoi pensare con oggetti (no DQL / SQL / qualunque cosa), scegli Propel.

Doctrine2 fa parte di Symfony2 di fatto ma le cose cambieranno molto presto, guarda l'ultimo articolo di Fabien Potencier.

Saluti, William


, ho iniziato con Propel 2 anni fa con symfony1, quindi ho dovuto passare a Doctrine2 per symfony2. Felice di tornare a Propel.Cheers!
Bhanu Krishnan,

2

Sono entrambi molto bravi. Ci sono alcuni casi limite in cui uno può fare qualcosa o fare qualcosa di meglio dell'altro. Ovunque abbia avuto problemi con entrambi, era dovuto più alla mia mancanza di conoscenza che a qualcosa che non potevano fare.

Ciò significa che la documentazione e il supporto sono più importanti dell'abilità intrinseca del codice. Conosci qualcuno che possa aiutarti in caso di problemi? Quanto bene vai avanti con la documentazione? Uno di loro "ti sembra" più naturale per te?


2

Ho scelto Propel 1.63 per un'applicazione mysql legacy di grandi dimensioni (circa 200 tabelle) - i fattori qui inclusi: supporto IDE che consente ai nuovi sviluppatori di orientarsi facilmente con il completamento del codice; supporto schema database incrociato, prestazioni; migliore supporto nativo per enum e l'uso di diversi comportamenti. In realtà ho iniziato con Doctrine poiché questo era il migliore supportato da Symfony2 ma una volta che Propel ha notevolmente migliorato il loro supporto con Symfony (la prossima piattaforma su cui migrerò alla fine) sono passato a causa della migliore gestione dei problemi di cui sopra. Nessun rimpianto a Propel è un vincitore decisivo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.