Doctrine 2: a che serve integrarlo in ZF?

salve ragazzi...

qualcuno di voi sa spiegarmi "praticamente" a cosa serve Doctrine?

Tra le mie incompetenze l'argomento database è quello nel quale faccio le figure peggiori... qual'è il vantaggio di usare Doctrine invece di Zend_DB?

inviato 5 anni fa
arjuna
X 0 X

Io non ho mai usato doctrine (mai avuta l'occasione reale per usarlo) ma ho letto qualcosa di qua e di la.

Doctrine, parlando terra terra, è un po' come zend_db. Crea uno strato per interfacciarsi al proprio database.

Rispetto all'uso degli oggetti che fornisce Zend Framework, doctrine mi sembra molto più completo e facile da usare. Il framewor della Zend è altamente "configurabile", sei tu che ti crei le tue "business rule" e come interfacciarti al tuo database, creando classi di oggetti figli di zend_db. Con Doctrine parte di questo lavoro è già fatto.

Almeno è questo che ho compreso nelle mie letture.

Bisognerà studiare meglio la cosa e mettere anche una bella guida su phpnews  ;)

risposto 5 anni fa
Mario Santagiuliana
X 0 X

C'è un abisso tra usare un ORM (come Doctrine) e usare Zend_Db (o simili).

Con un ORM devi fare solo una cosa: scrivere uno schema che descriva le tabelle del tuo database.

Tutto il resto lo fa l'ORM, esponendo delle classi che ti consentono di recuperare e manipolare i dati senza scrivere mezza riga di SQL.

risposto 5 anni fa
Massimiliano Arione
X 0 X

ORM, bene.

Vantaggi?

Oltre a programmare senza scrivere SQL, a che serve?

Attualmente sto usando Zend_DB e ho gia scritto gran parte dei models,

mi potrebbe convenire riscrivere tutto in Doctrine o perdo solo tempo visto che i Models in Zend_DB gia esistono?

Che vantaggi ne avrei?

La curva di apprendimento per installare e configurare Doctrine è lenta o ripida?

risposto 5 anni fa
arjuna
X 0 X

Scusa se è poco, programmare senza scrivere SQL... comunque ci sono anche altri vantaggi: numerosi behavior già pronti (te ne cito alcuni: sortable, sluggable, taggable) e poi la gestione delle relazioni.

Il vantaggio grande non è (solo) alla prima scrittura, ma soprattutto nelle riscritture successive, perché non ti costringe ad andare a cercare tutte le query che avevi scritto e a modificarle solo perché hai aggiunto/modificato/eliminato un campo.

Ovviamente un minimo di tempo di apprendimento va messo in conto, come per qualsiasi tecnologia con un po' di complessità, ma la documentazione è fatta abbastanza bene e ci sono numerosi esempi.

Una nota a margine: un altro grosso passo avanti sarebbe migrare a symfony, perché avresti anche l'integrazione coi form e un eccellente scaffolding del backend, tutti generati automaticamente partendo dai modelli. Mi rendo conto però che questo richiederebbe un tempo ancora più lungo, ma te lo segnalo ugualmente.

risposto 5 anni fa
Massimiliano Arione
X 0 X

Migrare a symfony sarebbe veramente assurdo!

Credo molto in Zend Framework, lo sostengo dalle versioni 0.X

Anzi, mi piacerebbe trovare collaboratori su Napoli per sviluppare più velocemente.

Ma giusto per curiosità: differenze tra symfony e Zend Framework?

per quanto riguarda doctrine sto guardando questo: http://static.zend.com/topics/Zend-Framework-1-+-Doctrine-2.pdf

risposto 5 anni fa
arjuna
X 0 X

non riesco a trovare un tutorial recente e sintetico su come integrare doctrine... ne conoscete?

risposto 5 anni fa
arjuna
X 0 X

Zend Studio non mi interpreta "namespace" e non gradisce la sintassi a slash, es:

namespace Doctrine\ORM;

ho impostato come motore  PHP 5.3.0 CGI, ma pare ancora non riconoscere le nuove sintassi

come avete risolto? non ci sono aggiornamenti, la versione di ZS che uso è la 7.2.1

risposto 5 anni fa
arjuna
X 0 X

Non ti consiglio di iniziare con Doctrine2, che è uscito da pochissimo.

Vai invece sulla versione 1.2, che è ben collaudata e sicuramente più documentata.

La differenza maggiore tra la versione 1.2 e la 2, oltre alla versione di PHP necessaria, è che la prima implementa il patterna active record, mentre la seconda no.

risposto 5 anni fa
Massimiliano Arione
X 0 X

Per l'integrazione di doctrine nella Zend Newsletter di oggi citavano la presenza di una videoguida.

Provate ad accedere qui per vedere le videoguide:

http://www.zend.com/en/resources/webinars/

risposto 5 anni fa
Mario Santagiuliana
X 0 X

La programmazione ad oggetti ed i database relazionali appartengono a due mondi diversi. A prima vista potrebbe non sembrare così, infatti molto spesso si pensa che basta associare una Classe ad una Tabella ed il gioco è fatto.

Quando si scrive una applicazione ad oggetti è buona norma organizzarla a strati. Lo schema MVC è infatti una suddivisione del codice in tre strati. Negli strati più vicini al database, quelli appartenenti al Model, più ci si avvicina al database e più si viene attratti dalla sua natura relazionale, più vicina alla programmazione procedurale che a quella ad oggetti. E così succede che senza accorgersene si inizia a scrivere codice che, nonostante risieda nei metodi delle classi, alla fine è più procedurale che ad oggetti. Fate caso a quanti metodi del Model potrebbero essere statici continuando a funzionare senza alcun problema. E questo è solo uno degli indizi che ci suggerisce che stiamo scrivendo codice procedurale (o finto codice ad oggetti).

Un altro sintomo di questo problema è dato dall'assenza di tutti quei benefici che la programmazione ad oggetti dovrebbe garantire: incapsulamento, modularità, riusabilità, ecc..

Il tutto a causa del database che è relazionale, non ad oggetti. Non potendo trasformare la natura del database, finiamo con lo snaturare il codice ad oggetti.

Soluzione? Gli ORM.

Un ORM è uno strumento che si pone come scopo quello di offrire un sistema di persistenza degli oggetti, nascondendo il database attraverso il quale si realizza tale persistenza. Il pratica il codice ad oggetti chiede all'ORM di gestire una sorta di archivio di oggetti relazionati tra loro. Il codice quindi non interagisce più direttamente con il database ma con l'ORM, in stile ad oggetti. Svanisce quindi l'attrazione del database verso la programmazione procedurale, ritorna il riuso, la modularità, ecc.. Tutto il codice può essere in perfetto stile object oriented.

Per rendersi conto di quanto l'ORM sia in grado di realizzare un sistema di persistenza di oggetti, si pensi alla possibilità di gestire la persistenza di gerarchie di classi (ereditarietà). Come la realizzereste con il classico pattern DAO?

 :bye:

risposto 5 anni fa
Gianni Tomasicchio
modificato 5 anni fa
X 0 X
La programmazione ad oggetti ed i database relazionali appartengono a due mondi diversi.

grazie per la spiegazione, è tutto molto chiaro.

sto guardando doctrine e vorrei essere guidato un pò, mi è stato suggerito di iniziare con la versione 1.2, ma ho letto che la versione 2 è molto diversa, non mi conviene cominciare con la 2 direttamente?

io ora comincio a studiare il getting started

http://www.doctrine-project.org/docs/orm/2.0/en/tutorials/getting-started-xml-edition.html

risposto 5 anni fa
arjuna
X 0 X
sto guardando doctrine e vorrei essere guidato un pò, mi è stato suggerito di iniziare con la versione 1.2, ma ho letto che la versione 2 è molto diversa, non mi conviene cominciare con la 2 direttamente?

Come già detto, se vuoi un po' di aiuto, ti conviene la versione 1.2, perché sulla 2 non troverai nessuno che ne sappia qualcosa.

risposto 5 anni fa
Massimiliano Arione
X 0 X

verissimo, anche se Doctrine 2 è troppo figo... :P

risposto 5 anni fa
Gianni Tomasicchio
X 0 X

Mi intrometto in questa discussione perchè proprio in questi giorni mi sto trovando davanti a questa problematica.

Sto lavorando ad un progetto molto grande, con molte entità nel db e molte relazioni tra di loro, alcune un pochino complesse.

Il sistema si basa sullo zf, e sto usando le Zend_Model_DbTable, ma davvero sto capendo che è un problema gestire soprattutto le relazioni.

Mi sto documentando sui vari ORM in giro: e ho trovato i seguenti:

- Doctrine

- Propel

- ReadBean

- Simphony

Ho visto velocemente le documentazioni dei vari, il doctrine mi sembra funzioni come Hibernate per Java, usando i commenti come base per capire i tipi dei campi del DB e le realazioni, Propel mi sembra leggermente più semplice..

Dato che devo lavorare con tante entità del DB, molte relazioni, secondo voi quale sarebbe meglio usare tra questi framework?

Inteso anche come compromesso tra facilità d'uso e la necessità di scrivere meno cose/codice in più possibile..

Grazie

Ciao

Luca

risposto 5 anni fa
Luca450Mhz
X 0 X

altro blog interessante, ci sono post sull'integrazione anche se non sono dettagliati.

http://christian.soronellas.es/?lang=en

risposto 5 anni fa
arjuna
X 0 X

Propel lo uso quotidianamente e mi dà molte soddisfazioni. È sviluppato attivamente e sta per uscire la versione 1.6

Doctrine è stato purtroppo un po' abbandonato: è uscita da poco la versione 2 (che però, come ho già detto, non è un vero ORM) e il supporto al ramo 1 terminerà a giugno 2011.

Gli altri non li conosco.

risposto 5 anni fa
Massimiliano Arione
X 0 X

Propel lo uso quotidianamente e mi dà molte soddisfazioni. È sviluppato attivamente e sta per uscire la versione 1.6

Doctrine è stato purtroppo un po' abbandonato: è uscita da poco la versione 2 (che però, come ho già detto, non è un vero ORM) e il supporto al ramo 1 terminerà a giugno 2011.

Gli altri non li conosco.

Perchè usi Propel invece di Doctrine?

E perchè usi Simphony invece di Zend Framework?

non conosco Simphony

risposto 5 anni fa
arjuna
X 0 X

Perchè usi Propel invece di Doctrine?

E perchè usi Simphony invece di Zend Framework?

non conosco Simphony

Symphony è un CMS e non c'entra niente col discorso framework.

Invece symfony (con la F, che sta appunto per "Framework") è un prodotto molto interessante. Sintetizzando molto i motivi per cui lo uso, ti dico:

- ha una comunità sviluppata e molto attiva, sia internazionale che nazionale

- mi ha fatto riscoprire il piacere di sviluppare, consentendomi di focalizzarmi su cosa fare e non su come farlo

un po' di tempo fa ho provato a guardare zf, ma non ci ho trovato troppe cose che ormai per me sono scontate e a cui non posso più rinunciare.

Comunque il mio parere è che sia molta più differenza tra usare un framework e non usarlo, piuttosto che tra usare un framework invece di un altro (symfony piuttosto che zf piuttosto che quello che vuoi)

Per quanto riguarda la scelta di Propel invece di Doctrine: hanno due filosofie diverse, il primo si basa sulla generazione del codice, mentre il secondo si basa su metodi magici e su un linguaggio di pseudo-SQL che secondo me è meno intuitivo.

risposto 5 anni fa
Massimiliano Arione
X 0 X
Doctrine è stato purtroppo un po' abbandonato: è uscita da poco la versione 2 (che però, come ho già detto, non è un vero ORM)

In che senso non è un vero ORM?

 :bye:

risposto 5 anni fa
Gianni Tomasicchio
X 0 X
In che senso non è un vero ORM?

Doctrine2 è un ODM: ha sostituito la parte Relational con una parte Document.

Infatti supporta anche i db non relazionali (i cosiddetti NoSQL).

Comunque è possibile ancora costruire un ORM sopra Doctrine2, ma semplicemente questo non è più il default.

risposto 5 anni fa
Massimiliano Arione
X 0 X

vi aggiorno sugli sviluppi:

ho letto la documentazione di doctrine 2.

ho letto i vari post sull'integrazione che vi ho segnalato.

ho usato questa struttura come riferimento:

https://github.com/guilhermeblanco/ZendFramework1-Doctrine2

ma ne viene fuori un Fatal error: Uncaught exception 'ReflectionException' with message 'Class Application\Entity\Zone does not exist'

Non mi trova la classe Zone.

Deve essere una questione di Autoloader, e in particolare l'autoloader di doctrine, ma non saprei come fare debug, non mi dice dove vuole cercarla quella classe.

Qualcuno è riuscito nell'integrazione?

risposto 5 anni fa
arjuna
X 0 X

ma ne viene fuori un Fatal error: Uncaught exception 'ReflectionException' with message 'Class Application\Entity\Zone does not exist'

Non mi trova la classe Zone.

Deve essere una questione di Autoloader, e in particolare l'autoloader di doctrine, ma non saprei come fare debug, non mi dice dove vuole cercarla quella classe.

Ma non hai xdebug?

risposto 5 anni fa
Massimiliano Arione
X 0 X
Ma non hai xdebug?

non ancora, cos'è?

risposto 5 anni fa
arjuna
X 0 X
Ma non hai xdebug?

non ancora, cos'è?

Qualcosa che ogni sviluppatore dovrebbe avere.

Corri subito a installarlo, poi mi ringrazierai con calma  ;)

risposto 5 anni fa
Massimiliano Arione
X 0 X

Qualcosa che ogni sviluppatore dovrebbe avere.

Corri subito a installarlo, poi mi ringrazierai con calma  ;)

intendi questo?

http://www.xdebug.org/docs/

risposto 5 anni fa
arjuna
X 0 X

intendi questo?

http://www.xdebug.org/docs/

Ma sei ancora lì? Non l'hai ancora installato? Non hai bisogno di leggere la documentazione, installalo e basta, poi prova di nuovo la pagina su cui avevi l'errore.

risposto 5 anni fa
Massimiliano Arione
X 0 X

eheheh, no, semplicemente non sono sul pc dove lavoro, l'avrei gia fatto! O0

risposto 5 anni fa
arjuna
X 0 X

bene, xdebug installato (ho dovuto rimuovere Zend Server CE e metterci Wamp)

ecco l'output:

( ! ) Fatal error: Uncaught exception 'ReflectionException' with message 'Class Application\Entity\Zone does not exist' in E:\www\ZF\library\Doctrine\ORM\Mapping\ClassMetadata.php on line 67

( ! ) ReflectionException: Class Application\Entity\Zone does not exist in E:\www\ZF\library\Doctrine\ORM\Mapping\ClassMetadata.php on line 67

Call Stack

#   Time   Memory   Function   Location

1   0.0015   684648   {main}( )   ..\index.php:0

2   0.2273   13385000   Zend_Application->run( )   ..\index.php:37

3   0.2274   13385000   Zend_Application_Bootstrap_Bootstrap->run( )   ..\Application.php:368

4   0.2275   13385096   Zend_Controller_Front->dispatch( )

ma non cambia nulla, questo gia lo sapevo  :'(

risposto 5 anni fa
arjuna
X 0 X

Questo lo sapevi?

Class Application\Entity\Zone does not exist in E:\www\ZF\library\Doctrine\ORM\Mapping\ClassMetadata.php on line 67
risposto 5 anni fa
Mario Santagiuliana
X 0 X

si, mi segnalava gia che non trovava la classe, il punto è che non so come capire dove vuole andarle a cercare le classi.

nel config (dell'applicazione Zend) ho impostato:

resources.doctrine.orm.entityManager.default.entityNamespaces.app = "Application\Entity"
resources.doctrine.orm.entityManagers.default.proxy.autoGenerateClasses = true
resources.doctrine.orm.entityManagers.default.proxy.namespace           = "Application\Entity\Proxy"
resources.doctrine.orm.entityManagers.default.proxy.dir                 = APPLICATION_PATH "/../library/Application/Entity/Proxy"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.adapterClass          = "Doctrine\ORM\Mapping\Driver\AnnotationDriver"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingNamespace      = "Application\Entity"
resources.doctrine.orm.entityManagers.default.metadataDrivers.0.mappingDirs[]         = APPLICATION_PATH "/../library/Application/Entity"

in library/Application/Entity/Zone.php:

<?php
namespace Application\Entity;
/**
 * @Entity(repositoryClass="Application\Entity\Repository\ZoneRepository")
 * @Table(name="catalogo_zone")
 */
class Zone
{
    /**
     * @Id @Column(type="integer")
     * @GeneratedValue(strategy="AUTO")
     */
    private $id;

    /** @Column(type="string") */
    private $nome;

    public function setNome ($nome)
    {
        $this->nome = $nome;
        return true;
    }

    public function getNome()
    {
        return $this->nome;
    }
}

dev'esserci un errore nella configurazione dei namespace... non vedo l'ora che esca ZF2

risposto 5 anni fa
arjuna
X 0 X

nel metodo che carica il diver ho inserito:

$metadataDriver->getAllClassNames();

ed ora va...

ma per me questa è scienza occulta e chiromanzia...

mi sapreste spiegare cosa ho fatto?

risposto 5 anni fa
arjuna
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda