Ovo pitanje se poteglo pre nekog vremena pa da i odgovorim na njega:
Citat:
Originalno napisao BraMom
Pomenuo si da koristiš neki code generator za kreiranje objekata koji rade sa tabelama u bazi.
Verovatno slično radim pod .NET, koristim CodeSmith.
Programiram i u PHP povremeno, pa bih voleo da čujem koje alate koristiš, nisam naleteo na nešto kvalitetno odrađeno za PHP.
|
Alat koji koristim sam sam napisao i to prilično davno. Kad sam pre nekog vremena mora da pravim jedan PHP4 skript izvukao sam taj stari kod iz arhive i preradio da liči na stvari koje sam u međuvremenu naučio (izvlačenje objekata slično Railsu itd). Na kraju mi se svidelo na šta je sve izašlo pa sam taj novi prepravio da fino radi sa PHP5 i koristi njegove nove mogućnosti.
Stvar funkcioniše prilično jednostavno. Dve abstraktne klase: DataObject (objekat koji predstavlja jedan row) i DataManager (poseduje definiciju tabele i metode za izvlačenje podataka i keširanje). Generator projuri sve tabele u navedenoj bazi i generiše naslednice ovih klasa tako da npr za usera dobiješ:
/base/BaseUser.class.php
/base/BaseUsers.class.php
/User.class.php
/Users.class.php
Bazne klase sadrže opis objekta i njegove metode (npr. accessori za polja, funkcije za izvlačenje podataka itd). Druge dve klase su prazne i u njih možeš da trpaš svoj kod. Kad sledeći put generator bude preletao diraće samo bazne klase, neće i ove koje ti modifikuješ tako da je sinhronizacija tabela i klasa koje im pristupaju jako jednostavna (izvršim jedan skript), a ti ne moraš da se brineš da će doći do nekog gubitka podataka.
Sve manje više liči na ActiveRecord, ali mi se nije svidelo učitavanje podataka o tabelama i redovima u svakom prolazu pa sam napravio generator. Manje više ista stvar jer ti omogućava:
PHP kôd:
$user = Users::findById(12);
if($user instanceof User) {
try {
$user->setUsername('root');
$user->save();
} catch(Exception $e) {
die($e->getMessage());
}
} else {
throw new Exception('Nema korisnika!');
}
ili jedan lep primer koji ja volim (ranije sam mrzeo paginaciju, sad pravim kakvu god hoćeš za 2 sekunde):
PHP kôd:
// Dodatni uslovi / trenutna stranica / broj itema po stranici
list($items, $pagination) = Messages::paginate(array(
'conditions' => '`publish_after` > ' . db_escape(new DateTime()),
'order' => '`publish_after` DESC'
), 1, 10);
Dobijem poruke koje su podešene da budu objavljene od trenutnog vremena i objekat koji ima sve informacije o paginaciji (koliko ukupno ima stranica, koja je trenutna stranica, da li ima prethodna i naredna itd). Prikaz prilično složene paginacije se svodi na jedan poziv...
Overkill? Za sve što ima preko 5 tabela ne po mom mišljenju. Sa ovim se stvarno radi brže...
BTW: Mana je što je samo persistance layer, nema mogućnost da skonta relacije među objektima... Za sada