Pogledajte određenu poruku
Staro 27. 03. 2006.   #1
Ilija Studen
Direktor Kombinata
Invented the damn thing
 
Avatar Ilija Studen
 
Datum učlanjenja: 07.06.2005
Poruke: 2.669
Hvala: 44
119 "Hvala" u 64 poruka
Ilija Studen će postati "faca" uskoroIlija Studen će postati "faca" uskoro
Default Generator klasa za pristup bazi podataka

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'
), 110); 
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

Poslednja izmena od Ilija Studen : 27. 03. 2006. u 20:19.
Ilija Studen je offline   Odgovorite uz citat