9

Si è appena imbattuto nel progetto Doctrine che ha un Object Relational Mapper e un DB Abstraction Layer. Cosa fornisce Doctrine se non altri livelli di astrazione PHP? E a quale uso pratico puoi mettere l'ORM, a parte il recupero di oggetti tramite query scritte in Doctrine Query Language? Il linguaggio di query è davvero qualcosa su cui vuoi sviluppare un'intera app web? Funziona bene?I vantaggi dell'uso di Doctrine per PHP?

Nel complesso, la creazione di un'app su Doctrine rende più semplice la manutenzione e la comprensione? È troppo ingegnerizzato e si basa su uno strato di astrazione sensibile per progetti di dimensioni medio-piccole? (< 50 schermate della GUI), anziché lavorare direttamente con MySQL.

risposta

15

Cosa fa Doctrine a disposizione di altri livelli di astrazione PHP?

  1. Implementa modello DataMapper piuttosto ActiveRecord.
  2. Supporta annotations, XML e YAML per lo schema.
  3. Utilizza DQL.
  4. Utilizza i vantaggi di PHP 5.3+.
  5. È veloce e ha una grande comunità.
  6. Tranne ORM c'è ODM.

Il linguaggio di query è davvero qualcosa su cui si desidera sviluppare un'intera app Web?

Solo una parte dell'applicazione responsabile della manutenzione di oggetti business deve essere a conoscenza dell'esistenza di Doctrine. E quella parte non deve essere al 100% basata su Doctrine.

Nel complesso, la creazione di un'app su Doctrine rende più semplice la manutenzione e la comprensione?

Definitivamente. Il codice è più facile da leggere, capire e mantenere.

È eccessivamente ingegnerizzato ed è ragionevole per i progetti di dimensioni medio-piccole?

In realtà Doctrine è piuttosto semplice nei suoi fondamenti. Ed è un'ottima scelta per piccole, medie e anche alcune grandi applicazioni.


La dottrina non è la risposta per tutto e talvolta è un po 'problematica. Tuttavia per compiti tipici è estremamente utile. IMHO il miglior ORM/ODM per PHP in questo momento.

2

Vorrei aggiungere alcuni punti alla risposta di Crozin, ma sfortunatamente non posso commentare. Eccoli:

  • Doctrine non usa i metodi magici __get() e __set() per accedere agli attributi di entità, tutti gli attributi di entità dovrebbero avere getter/setter. Ciò migliora il completamento del codice IDE e non è necessario controllare la struttura della tabella DB per tutto il tempo.
  • Doctrine ti astrae completamente da nomi di campi di tabelle reali. Una volta mappate le proprietà dell'entità nei campi DB, si usano nomi di proprietà ovunque. Lo stesso per i nomi delle tabelle.
  • Doctrine utilizza un modello di repository che nasconde i dettagli di ottenere entità.
  • Doctrine utilizza l'approccio "code first", quindi è possibile creare prima le entità e quindi generare automaticamente il database. Il caso inverso è anche possibile.
  • Doctrine dispone di un potente generatore di query, quindi è possibile utilizzare il modello di builder per query con parti condizionali.
  • Doctrine utilizza chiavi e vincoli esterni per eseguire azioni in cascata e mantenere i dati coerenti.
  • UnitOfWork di Doctrine è un abbastanza grande e intelligente cosa, che non ha analogo in altri ORM php

IMHO al momento dottrina fornisce miglior supporto completamento del codice IDE e DB livello di astrazione tra tutti ORME php disponibili. Non è eccessivamente ingegnerizzato e segue i principi SOLIDI.

0

Vorrei aggiungere un punto alla risposta di GerKirill. L'assenza di supporto per i metodi magici getter/setter è una debolezza, IMHO, non una forza. Se hai mai sfogliato dozzine di pagine di getter/setter identici, ti renderai conto che questi metodi sono un enorme spreco di spazio (per non parlare del tempo di compilazione). Nessuno imposta accidentalmente una variabile oggetto e un setter non ti impedisce di farlo ... quando vuoi cambiare la proprietà, devi solo chiamare il setter (come fa un setter a "proteggere" la proprietà - se sei andando a fare un refuso e impostando direttamente il valore sbagliato della proprietà, farai lo stesso errore di battitura e chiamerai il setter sbagliato). Ed è molto raro che un setter o un getter facciano qualcosa di diverso da ottenere o impostare una proprietà. Se devi fare qualcosa di speciale per impostare o ottenere una proprietà, quella proprietà dovrebbe essere un metodo (vedi http://www.yegor256.com/2014/09/16/getters-and-setters-are-evil.html), o dovresti refactoring il tuo codice, o dovresti chiamare una funzione di validazione della proprietà (generalmente nel momento in cui l'oggetto è creato). Questo è uno di quei truismi non sfidati che affliggono il mondo OO. Pensaci prima di pubblicare la risposta standard ricevuta-saggezza.