Ieri sera, nell’articolo di wikipedia Object Relationship Modeling ho trovato, tra i collegamenti esterni un ORM per PHP 5 di nome Propel, rilasciato con licenza LGPL.
Propel fa il parsing di file schema scritti in xml per generare Object Model scritti in php, e devo dire che questo mi sembra a naso un anti-pattern
La compatibilità è garantita su un gran numero di database, grazie al layer di astrazione Creole.
Ecco un assaggio di come può essere una parte di uno schema XML:
<table name="book">
<column name="book_id" type="INTEGER" required="true" primaryKey="true"/>
<column name="title" type="VARCHAR" size="100" required="true"/>
<column name="author_id" type="INTEGER" required="true"/>
<foreign-key foreignTable="author">
<reference
local="author_id"
foreign="author_id"/>
</foreign-key>
</table>
<table name="author">
<column name="author_id" type="INTEGER" required="true" primaryKey="true"/>
<column name="fullname" type="VARCHAR" size="40" required="true"/>
</table>
C’è da dire che come schema sembra molto verboso, soprattutto nella specificazione delle foreign key… Mi sembra di capire che l’utilizzo intensivo dell’xml può essere dettato da una necessità inconscia di non voler programmare in quel linguaggio certo non elegantissimo che è il php.
Il sistema di generazione file mi sembra che ricalchi quello di Ruby on Rails e di PRADO, ovvero mediante tool esterni a riga di comando. Non sopporto quest’idea di separare lo sviluppo in due fasi, ovvero “generazione superautomatizza” e “customizzazione” poichè per tornare ad usufruire dei vantaggi della generazione bisogna buttare via le personalizzazioni.
L’utilizzo finale sembra essere piuttosto comodo e comparabile con altri framework simili (si veda il post su doctrine). Inoltre, contrariamente a DB_DataObject, quando vengono inpostati i campi dei record non si usa l’accesso diretto alle variabili d’istanza, ma vengono utilizzati dei setter come si può vedere nel seguente esempio:
$author = new Author();
$author->setFirstName("Leo");
$author->setLastName("Tolstoy");
$pub = new Publisher();
$pub->setName("Viking Press");
$book = new Book();
$book->setTitle("War & Peace");
$book->setIsbn("0140444173");
$book->setPublisher($pub);
$book->setAuthor($author);
// save (insert, in this case) the new object
$book->save();
Di particolare interesse è piuttosto la generazione della sezione WHERE delle SELECT: invece di usare un vero e proprio “pezzo” di codice SQL come fa DB_DataObject con il metodo whereAdd(), propel usa un sistema più avanzato (ed astratto) tramite i cosiddetti Criteria, p.es:
$c = new Criteria();
// Find all authors with first name Karl but
// last name is _not_ Marx.
$c->add(AuthorPeer::FIRST_NAME, "Karl");
$c->add(AuthorPeer::LAST_NAME, "Marx", Criteria::NOT_EQUAL);
// Find all authors with last name of Tolstoy, Dostoevsky, or Bakhtin
$c2 = new Criteria();
$c2->add(AuthorPeer::LAST_NAME, array("Tolstoy", "Dostoevsky", "Bakhtin"), Criteria::IN);
Piuttosto interessante ma eccessivamente verboso per i miei gusti, nonostante fornisca interessanti spunti di riflessione.
L’ultima nota importante è l’emulazione della ON DELETE CASCADE via PHP per tutti i database che non la supportano nativamente, ad esempio MySQL.
Per altre informazioni: qui c’è la guida
ho provato ad installarlo con pear ma non c’e proprio speranza.
tu come hai fatto ?
hai avuto problemi.
Io anche seguendo tutte le vaire guide non ho avuto successo
suggerimenti ?
ciao grazie
david
Commento di david — giugno 25, 2007 @ 5:29 pm
alli
Commento di alli — agosto 3, 2007 @ 5:26 am
power roulette strategy
Commento di power roulette strategy — agosto 8, 2007 @ 5:02 am
kama sutra positions
Commento di kama sutra positions — agosto 9, 2007 @ 4:54 am
Play Casino Slots Online
Commento di Play Casino Slots Online — novembre 28, 2007 @ 1:16 am