2011-02-02 23 views

risposta

25

(7-mar-2013) Esonero di responsabilità: Questa risposta è probabilmente ora è un po 'fuori moda. Al momento non sto tenendo il passo con la comunità PHP e questo confronto è tra Doctrine ORM v2 e Zend Framework v1. Questo è un confronto tra mele e arance perché sono due cose diverse.


Out-of-the-box Zend_Db è più solo un Database Abstraction Layer maggiore sulla parte superiore della DOP, dove, come Doctrine 2 è un Object Relational Mapper (che si trova sulla cima di essa la propria DBAL).

Doctrine 2 è molto meglio per i livelli di dominio più complicati, poiché tutte le logiche di business, la logica di persistenza, ecc. Sono separate su più classi, quindi non servono più ruoli. Inoltre, dato che hai più classi - che sono più pulite e scarsamente accoppiate - le rende molto più facili da testare.

Futhermore, ti scriverà soltanto frazione del SQL che si prevede di utilizzare Zend_Db, perché è possibile manipolare gli oggetti entità e Dottrina traduce coloro modifica al database. L'SQL generato sfrutta anche le transazioni che ti garantiscono un guadagno di prestazioni decente!

Mi raccomando di leggere su Domain-Driven Design per capire meglio perché Doctrine 2 è così fantastico.

Non fraintendetemi, però, si può fare con DDD Zend_Db ma non è davvero lì OOTB (perché non è un ORM), e non sarebbe così potente e ricco di funzionalità come la Dottrina 2.

+1

concordato. Zend_Db è un casino per qualsiasi progetto medio o grande. Mentre in Doctrine hai un repository per ogni entità, con Zend_Db finirai per estendere Zend_Db_Table, che usa il pattern Table Data Gateway, e includendo metodi come getAllAllowedUsers() con SQL doganale che unisce diverse tabelle e risultante in una Zend_Db_Table_Row che in realtà non fa Non ha nulla con il tuo modello di business attuale. Quindi unisci Zend_Db_Table con il pattern Repository. Forse ti rendi conto che hai effettivamente bisogno di un Data Mapper, quindi inizi a creare la tua implementazione, reinventando la ruota. –

+0

O anche peggio: alcuni sviluppatori creano i selettori sul controller stesso. 'listAction() {' $ UsersTable-> select() '...' –

+0

So che questa è una vecchia domanda, ma in 2 anni di dottrine 2 + zend framework experince non raccomanderei assolutamente l'uso di doctrine 2 IT IS SLOW SLOW, non è buono per l'applicazione web, ha una grande astrazione ma ha anche grandi svantaggi. – albanx

0

Se si dispone di un piccolo wich progetto è obbligata ad utilizzare un DBMS specifico, non hanno bisogno di ORM e dottrina.

Se si dispone di un wich progetto è grande e in futuro potrebbe essere necessario adattatori per passare da un DBMS ad un altro, di quanto si potrebbe considerare l'utilizzo Dottrina

Come si può leggere nella descrizione dottrina:

Doctrine 2 è un mapper oggetto-oggetto (ORM) per PHP 5.3.0+ che fornisce persistenza trasparente per oggetti PHP . Si trova in cima a un potente strato di astrazione del database (DBAL). Object-Relational Mappers primary task è la traduzione trasparente tra oggetti (PHP) e righe di database relazionali .

+1

si prega di definire "grande" :-) Grazie – opHASnoNAME

+1

La risposta implica che il vantaggio principale di un ORM è la portabilità del DBMS. Ma il semplice PDO, o qualsiasi altro DBAL, lo fornisce.Trovo che il vero vantaggio di un ORM sia la netta distinzione tra i modelli stessi e la loro persistenza/idratazione da/verso un repository. –

0

Zend_DB e Doctrine utilizzano diversi modi. Zend_DB funziona come gateway dati di tabella e gateway dati di riga. Doctrine è object mapper.

Nella mia esperienza Zend_DB abbastanza e veloce per le attività più comuni. Doctrine è lento e utilizza più memoria di Zend_DB.

+0

Nella mia esperienza è più difficile mantenere un codice che non ha una separazione netta tra business logic e livello di accesso ai dati. Si tende ad utilizzare pattern simili di Active Record quando si ha a che fare con il proprio modello. Ad esempio, estendendo Zend_Db_Table_Row e Zend_Db_Table o persino creando i propri data mapping e repository (pattern Repository). Penso che sia sicuramente per piccoli progetti e team. –