Razvoj web aplikacije korištenjem PHP MVC frameworka

SVEUČILIŠTE U MOSTARU
FAKULTET PRIRODOSLOVNO – MATEMATIČKIH I ODGOJNIH ZNANOSTI
MATEMATIKA - INFORMATIKA
Ana Raič
Razvoj web aplikacije korištenjem PHP MVC frameworka
Diplomski rad
Mostar, 2014.
SVEUČILIŠTE U MOSTARU
FAKULTET PRIRODOSLOVNO – MATEMATIČKIH I ODGOJNIH ZNANOSTI
MATEMATIKA - INFORMATIKA
Razvoj web aplikacije korištenjem PHP MVC frameworka
Diplomski rad
Mentor:
Doc.dr.sc. Goran Kraljević
Student:
Ana Raič
Mostar, rujan 2014.
Sadržaj:
1.
Uvod..................................................................................................................................... 1
2.
Softverski dizajnerski obrasci................................................................................................. 3
3.
MVC (Model-View-Controller) ............................................................................................... 7
4.
3.1.
Povijest i razvoj ....................................................................................................................... 7
3.2.
Model ...................................................................................................................................... 8
3.3.
Pogled (View)......................................................................................................................... 10
3.4.
Kontroler (Controller) ............................................................................................................ 11
3.5.
Prednosti MVC arhitekture.................................................................................................... 11
3.6.
Nedostaci MVC arhitekture ................................................................................................... 14
3.7.
Varijante Model-View-Controller uzorka .............................................................................. 14
PHP (Personal home page/Hypertekst Pretprocessor) .......................................................... 16
4.1. Razvoj programskog jezika PHP ................................................................................................ 16
4.1.1.
4.1.2.
4.1.3.
4.1.4.
4.1.5.
5.
PHP/FI ................................................................................................................................. 16
PHP/FI 2.0 ........................................................................................................................... 17
PHP 3.................................................................................................................................. 17
PHP 4 .................................................................................................................................. 17
PHP 5 .................................................................................................................................. 18
4.2.
Kako zapravo radi PHP? ......................................................................................................... 18
4.3.
Osnovne karakteristike PHP-a ............................................................................................... 20
4.4.
Prednosti PHP-a ..................................................................................................................... 22
4.5.
Razvoj velikih aplikacija u PHP-u ........................................................................................... 23
4.6.
Usporedba PHP-a s drugim programskim jezicima ............................................................... 25
4.7.
Struktura PHP web aplikacije bez korištenja MVC arhitekture ............................................. 26
MVC u web aplikacijama ..................................................................................................... 35
5.1. Framework (radni okvir) ............................................................................................................ 35
5.1.1.
5.1.2.
5.1.3.
5.1.4.
5.2.
Definicije frameworka ........................................................................................................ 36
Struktura frameworka ........................................................................................................ 37
Svojstva frameworka .......................................................................................................... 37
Prednosti korištenja frameworka ....................................................................................... 38
Popularni PHP MVC frameworci............................................................................................ 39
5.2.1.
5.2.2.
5.2.3.
5.2.4.
5.2.5.
Zend Framework ................................................................................................................. 39
CakePHP Framework .......................................................................................................... 42
CodeIgniter Framework ...................................................................................................... 44
Yii framework...................................................................................................................... 45
Symfony framework ........................................................................................................... 46
6.
Primjer web aplikacije ......................................................................................................... 48
6.1. Struktura PHP web aplikacije izgrađene pomodu CodeIgniter-a ............................................... 48
7.
Zaključak ............................................................................................................................ 57
8.
Literatura............................................................................................................................ 59
Dodatak A: Popis slika ................................................................................................................ 60
Dodatak B: Popis oznaka i kratica ............................................................................................... 61
1. Uvod
Današnje web aplikacije u velikom broju slučajeva nude mogućnosti prikazivanja i rada s
podacima koji se nalaze trajno pohranjeni unutar baze podataka ili rjeĎe datotečnog sustava.
Osim što mogu nuditi funkcionalnosti pregledavanja podataka na različite načine,
omogućavaju dodavanje novih, te mijenjanje i brisanje postojećih podataka.
Sve spomenute operacije korisnik obavlja kroz grafičko korisničko sučelje (eng. Graphical
User Interface – GUI) koje bi trebalo biti izvedeno tako da korisnik što efikasnije i
jednostavnije ostvari željeni cilj. S druge strane aplikacija osim korisničkog sučelja najčešće
sadržava implementaciju odreĎene poslovne logike i mogućnost pristupa odreĎenom
spremištu podataka. U konačnici se tok podataka odvija u oba smjera izmeĎu korisničkog
sučelja i spremišta podataka, a posredstvom poslovne logike. Iz navedenog se može zaključiti
da različiti logički dijelovi web aplikacije imaju meĎusobno veliki stupanj interakcije i zato ih
je potrebno dizajnirati da meĎusobno budu što neovisniji, a da u isto vrijeme pružaju
jednostavna i učinkovita sučelja (eng. interface), što je opisano u prvom poglavlju.
Da bi sama web aplikacija, kao i programski kod od kojeg je sačinjena, bili što učinkovitiji i
kvalitetniji, koriste se uzorci (eng. patterns). Svaki uzorak se odnosi na problem koji se često
pojavljuje prilikom razvoja programske podrške, a zatim opisuje način rješavanja tog istog
problema. Postavlja se pitanje na koji način dizajnirati funkcionalnosti korisničkog sučelja
web aplikacije tako da se spomenuti zahtjevi mogu što jednostavnije implementirati.
Jedan od najpoznatijih uzoraka koji ostvaruje tražene zahtjeve je Model-View-Controller, koji
odvaja prezentacijsku logiku aplikacije od poslovne logike i samih podataka. Naziv je dobio
prema tri osnovne konceptualne komponente od kojih se sastoji. Struktura i način rada ovog
uzorka detaljno je opisana u poglavlju 3.
Četvrto poglavlje ovog rada bavi se PHP-om (eng. Personal Home Page Tools). To je široko
rasprostranjen Open Source skriptni jezik koji se izvršava na strani web servera, a namijenjen
je za kreiranje dinamičkih web stranica, te općenito različitih internet aplikacija. PHP je
podržan od strane velikog broja platformi (gotovo svih), ali se posebno udomaćio na
Unix/Linux platformi.
Posljednjih godina PHP je zahvatila struja kojom se taj skriptni programski jezik podigao na
jednu višu, profesionalniju razinu.
1
Radi se o PHP paketima (php framework) koji služe kao alati za brži i sigurniji razvoj internet
aplikacija. Njihova namjena je prvenstveno bila da se gotovi alati iz jedne tehnologije sastave
u jedan praktični okvir pa da se tako nastali paket koristi kao jedan kompletan alat. Tako bi
programer bez razmišljanja imao na raspolaganju osnovne funkcionalnosti tehnologije koju
koristi i posvetio se samo logici aplikacije koju gradi, problemima organizacije datoteka,
klasifikacije objekata i slično. U ovom radu, u petom poglavlju, navedeno je i objašnjeno pet
različitih PHP MVC frameworka: Zend, CakePHP, CodeIgniter, Yii i Symfony framework.
Praktični dio ovog rada prati razvoj web aplikacije korištenjem PHP MVC CodeIgniter
frameworka. Osnovna ideja je pokazati prednosti ovakvog korištenja arhitekture pri pisanju
skripti za izradu projekta za iznajmljivanje apartmana na obalama Jadrana u odnosu na
arhitekturu koja je korištena pri izradi istog projekta prošle akademske godine, u okviru
kolegija Programiranje za internet. Od svih opisanih frameworka, CodeIgniter je odabran
zbog svojih visokih performansi, velike zajednice korisnika i jednostavnosti korištenja.
2
2. Softverski dizajnerski obrasci
Od početka softverskog inženjerstva četrdesetih godina prošlog stoljeća do danas razvoj
softvera konstantno napreduje. Širi se spektar namjene aplikacija i raste njihova složenost.
Stalni ciljevi su poboljšanje produktivnosti softverskih inženjera i povećanje kvaliteta
aplikacija za krajnjeg korisnika.
U početku razvoja kompjutera, programi su direktno ovisili o hardveru koji je bio ugraĎen.
Razlikovao se hardver za poslovne i naučne aplikacije. Sustavni softver bio je besplatan, a
dobivao se uz računalo budući da je bez softvera računalo bilo beskorisno. Računala su se
nalazila u tzv. „mašinskoj sali“, a programeri su rezervirali vrijeme za pristup računalu ili
zaduživali operatere za konkretne zadatke. Ulaz u računalo predstavljale su bušene kartice, a
izlaz se čekao na pisaču. Bilo kakvo planiranje i upravljanje razvojem softvera bilo je gotovo
nemoguće.
Zanimljivo je napomenuti da su sve do 1960.-ih godina programeri često bile žene. Prvi
programer je zapravo programerka, Ada Byron Lovelace. Ada je bila suradnica Charlesa
Babbagea, slavnog izumitelja analitičkog stroja. Inspirirana Babbageovim radom vjerojatno je
prva osoba koja je istražila njegove nevjerojatne mogućnosti. Adine bilješke o stroju sadrže
ono što se danas smatra prvim algoritmom koji se napravio da bi ga stroj mogao obraditi.
Zbog ovoga se i smatra prvom računalnom programerkom te je u njenu čast jedan programski
jezik po njoj dobio ime. Muškarci su bili na prestižnijim i bolje plaćenim poslovima – bavili
su se hardverom.
Hardver se mijenjao jako brzo, i svakih godinu-dvije posao programera bio je prevoĎenje
programa na novija računala. Upravo to je potaknulo razvoj softverskih jezika višeg stupnja:
FORTRAN, COBOL i ALGOL. Neke tvrtke počele su nuditi uslugu razvoja „custom“
softvera, ali još uvijek nije nitko prodavao softverske pakete.
Već u to doba pojavila se ideja o ponovnoj upotrebi dijelova softvera, modularnom
programiranju i apstrakciji podataka. Kako je softver bio besplatan, mnoge tvrtke su
dobrovoljno davale kataloge sa komponentama za ponovnu upotrebu (npr. IBM-ova grupa
SHARE).
3
Razvoj softvera glavni je faktor u razvoju informacijskih tehnologija. Primjena softvera se
raširila na sva područja ljudskog djelovanja. Mogućnosti razvoja softvera, pored već
postignutih rezultata, i dalje su nezamislive. Razvoj programskih jezika, a posebno jezika
četvrte generacije, objektno orijentiranog programiranja te pokušaja stvaranja univerzalnih
programskih alata, dovodi do toga da se softver sve više približava korisniku i postaje
jednostavniji za upotrebu. Zbog mnoštva gotovih programskih paketa za različite namjene,
danas najčešće nije isplativo razvijati svoj softver. Naravno, ostaje potreba za razvojem
specifičnih softverskih rješenja za pojedina područja, kao i dodatnih programa, koji
predstavljaju nadogradnju već kupljenih softverskih paketa.
Razvoj softvera je težak, a razvoj softvera na takav način da se njegovo rješenje može ponovo
upotrijebiti još je teže. Mnogi iskusni programeri su imali tih problema i s vremenom su se
pojavili zajednički obrasci koji bi pomogli njihovom rješavanju. Christopher Alexander prvi
je opisao obrasce na takav način da se mogu primijeniti na razvoj softvera. Rekao je: „Svaki
uzorak opisuje problem koji se javlja iznova i iznova u našem okruženju, a zatim opisuje srž
rješenja tog problema, ali na takav način da je jedno rješenje moguće koristiti milijun puta, a
da nikad to ne uradimo dva puta na isti način“.
Pod pojmom softverski produkt podrazumijeva se skup računalnih programa i pripadne
dokumentacije, stvoren zato da bi se prodao nekom korisniku. Može biti razvijen za nekog
odreĎenog korisnika (bespoke product, customized product) ili općenito za tržište (generic
product). Softverski produkt često se kraće naziva softver ili (softverski) sustav. Za današnji
softver podrazumijeva se da on mora biti kvalitetan. Preciznije, od softverskog produkta se
očekuje da se on odlikuje sljedećim atributima kvalitete:
 Mogućnost održavanja: Softver se mora moći mijenjati u skladu s promijenjenim
potrebama korisnika.
 Pouzdanost i sigurnost: Softver se mora ponašati na predvidiv način te ne smije
izazivati fizičke ili ekonomske štete.
 Efikasnost: Softver mora imati zadovoljavajuće performanse te treba upravljati
strojnim resursima na štedljiv način.
 Upotrebljivost: Softver treba raditi ono što korisnici od njega očekuju, a sučelje mu
treba biti zadovoljavajuće te za njega mora postojati dokumentacija.
4
Softversko inženjerstvo je disciplina koja se bavi svim aspektima proizvodnje softvera. Dakle,
softversko inženjerstvo bavi se modelima, metodama i alatima koji su nam potrebni da bi na
što jeftiniji način mogli proizvoditi što kvalitetnije softverske produkte.
Softversko inženjerstvo može se smatrati znanstvenom disciplinom, ali takoĎer i tehničkom
strukom. U oba slučaja, ono je u bliskoj vezi s još dva područja znanja:
 Računarstvo (computer science): Poznavanje teorijskog računarstva potrebno je
softverskom inženjerstvu na sličan način kao što je poznavanje mehanike potrebno
strojarskom tehničaru.
 Sistemsko inženjerstvo (system engineering): Bavi se razvojem složenih sustava koji
se sastoje od hardvera, softvera i ljudskih aktivnosti. Softverski inženjer mora svoje
softversko rješenje uklopiti u takav složeniji sustav.
Softversko inženjerstvo je takoĎer i profesija. U mnogim zemljama softverski inženjeri
organizirani su u strukovne udruge koje štite njihova prava, ali donekle i ograničavaju
slobodu njihovog djelovanja. Primjeri takvih udruga su ACM, IEEE-CS i British Computer
Society. Udruge donose pravila ponašanja za svoje članove.
Na web stranici
(http://www.acm.org/about/se-code) može se naći etički kodeks softverskih inženjera kojeg su
zajednički usvojili ACM i IEEE-CS.
Softversko inženjerstvo počelo se razvijati krajem 60-ih godina 20. stoljeća. Sam naziv
izgleda da je bio skovan na jednoj NATO konferenciji u Njemačkoj 1968. godine. Disciplina
je nastala kao odgovor na takozvanu „softversku krizu“. Naime, pojavom računala treće
generacije (na primjer IBM serija 360) stvorila se potreba za složenijim softverom (na primjer
multi-tasking operacijski sustav). Pokrenuti razvojni projekti višestruko su premašili planirane
troškove i rokove. Vidjelo se da se dotadašnje neformalne tehnike individualnog
programiranja ne mogu uspješno „skalirati“ na velike programe gdje sudjeluje veliki broj
programera. Osjećala se potreba za metodama razvoja softvera koje bi bile u stanju
kontrolirati kompleksnost velikog softverskog projekta. Stanje svijesti iz tih vremena
plastično je opisano u čuvenoj knjizi1.
Od 60-tih godina 20. stoljeća do danas softversko inženjerstvo prešlo je dug put. Ispočetka su
se predlagale metode razvoja softvera oblikovane po analogiji s metodama iz tradicionalnih
1
Brooks F.P.: The Mythical Man Month – Essays on Software Engineering, Anniversary Edition. Addison-Wesley,
Reading MA, USA, 1995.
5
tehničkih struka (na primjer mostogradnja). Kasnije se uvidjelo da je softver po mnogočemu
specifičan te da zahtjeva drukčije pristupe. Razvijali su se novi programski jezici, bolji načini
utvrĎivanja zahtjeva, grafički jezici za modeliranje, formalne metode za specifikaciju i
verifikaciju, pouzdaniji načini voĎenja projekata i procjene troškova, alati koji nastoje
automatizirati proces razvoja softvera. Zahvaljujući takvom razvoju, softversko inženjerstvo
uspjelo je etablirati kao važan dio tehnike i računarstva. Softver se u današnje vrijeme
proizvodi daleko predvidljivije i efikasnije nego prije. Ipak, još uvijek postoji širok prostor za
poboljšanje.
Važna osobina softverskog inženjerstva je da u njemu nema „jednoumlja“ ni jednoobraznosti.
Za razliku od matematike gdje se proučavaju nepobitne istine, u softverskom inženjerstvu
razvijaju se različite ideje i pristupi koji su često u meĎusobnom nesuglasju. Glavni razlog za
takvu raznolikost pristupa je raznolikost samih softverskih produkata – zaista, teško je
očekivati da se sve vrste softvera mogu razvijati na isti način. Drugi razlog za raznolikost je
činjenica da softversko inženjerstvo još uvijek nije doseglo svoju zrelu fazu – ta disciplina se i
ovog trenutka intenzivno razvija, a nove spoznaje revidiraju stare.
6
3. MVC (Model-View-Controller)
3.1.
Povijest i razvoj
Kako se razvijalo objektno orijentirano programiranje, sve se više ukazala potreba razdvajanja
dizajniranja sučelja od ostalih dijelova sustava.
Sučelja su dijelovi pomoću kojih komponente sustava meĎusobno komuniciraju. Česte su
komunikacije dijelova programa meĎusobno, ali i izmeĎu dijelova programa i ljudi. Za
očekivati je da će se dizajn sučelja često mijenjati i prilagoĎavati i ljudima i tehnologiji, i to
puno češće nego će se mijenjati sama obrada podataka koja je u pozadini sustava. Zbog toga
se odvajanje ova dva dijela sustava pokazalo vrlo praktičnim i ubrzalo je razvoj i održavanje
softvera.
Još u 1970-tim godinama, profesor Trygve Reenskaug predložio je za upotrebu SmallTalk
objektnog jezika arhitekturu Model-View-Controller (MVC), koja je omogućavala
razdvajanje sučelja (GUI – Graphical User Interface) od ostalog dijela programa, a od 2009.
godine Microsoft je prihvatio taj koncept i razvio MVC okvir kako bi „zaustavio miješanje
programske logike i prezentacijske logike“ (Deacon, 2013.)
Model-View-Controller (MVC) je obrazac softverske arhitekture. Koristi se u softverskom
inženjerstvu za odvajanje pojedinih dijelova aplikacije u komponente ovisno o njihovoj
namjeni. MVC dijeli aplikaciju na tri glavne komponente: model, pogled (view) i kontroler
(controller). MVC softverski obrazac specificira gdje će biti smješten odreĎeni tip
aplikacijske logike. Tako će UI logika biti u komponenti view (pogled), poslovna logika u
model komponenti, dok će logika unosa biti smještena u kontroler komponenti. Ovakvo
razdvajanje omogućuje manju kompleksnost pri razdvajanju aplikacija tako što omogućava
fokusiranje samo na jedan njen dio. Na primjer, prvo se korisnik može u početku fokusirati
samo na UI, a kasnije razvijati logiku. Ovakav način pristupa aplikaciji omogućuje da jedan
programer može raditi na UI, drugi na kontroler logici, dok treći na poslovnoj logici modela.
Dvije osnovne ideje nalaze se u osnovi ove arhitekture, a to su ponovno korištenje već
postojećeg koda i jasna raspodjela dužnosti meĎu pojedinim dijelovima sustava. Prva ideja
omogućava da se jednom napisani kod uz minimalne ili čak nikakve izmjene može koristiti u
više različitih projekata. Druga ideja je podjela sustava na više meĎusobno neovisnih cjelina
7
od kojih svaka ima svoj zadatak i koje se pojedinačno mogu modificirati bez straha da će se te
promijene odraziti na ostatak sustava.
Slika 1 prikazuje ovisnost izmeĎu objekata MVC uzorka. Važno je zapaziti da View i
Controller ovise o Model komponenti. S druge strane, Model ne ovisi niti o View
komponenti, niti o Controller komponenti. Ova neovisnost Model komponente je izrazito
važna jer omogućava da ta komponenta bude razvijena i testirana neovisno o prezentacijskoj
logici.
Odijeljenost View komponente i Controller komponente je sekundarne naravi tako da se čak
kod nekih varijanti Model-View-Controller uzorka te dvije komponente udružuju u jednu.
Takva implementacija često je zastupljena kod klijentskih (desktop) aplikacija. MeĎutim, kod
web aplikacija granica izmeĎu te dvije komponente je izražena, budući da se prezentacijski
sloj (View) nalazi na strani korinsika i vidljiv je kroz web preglednik, dok se dogaĎaji
obraĎuju na poslužiteljskoj strani (Controller).
Slika 1. Dijagram razreda MVC uzorka – konceptualni pogled
3.2.
Model
Model se sastoji od podataka, poslovnih pravila, logike i funkcija ugraĎenih u programsku
logiku. Čini samu bit aplikacije, a sastoji se od skupa klasa koje modeliraju i podržavaju
rješavanje problema kojim se aplikacija bavi, i taj dio je obično stabilan i trajan koliko i sam
problem. Postoji nekoliko načina na koje je moguće stvoriti kostur modela. Programer može
prvo definirati klase te odnose atributa unutar svake klase i tako stvarati bazu podataka ili
može prvo stvoriti bazu podataka te dopusti samom procesu da automatski stvara klase.
8
Kada se identificiraju klase modela koje će se implementirati u web aplikaciju, potrebno je
uzeti u obzir i veze izmeĎu njih. Na primjer, u slučaju korištenja aplikacije za rezervaciju
apartmana, svaka pojedina rezervacija bit će vezana za jednog, i samo jednog, korisnika koji
je rezervirao željeni apartman u odreĎenom vremenskom razdoblju. Takva veza je poznata
kao jedan-na-jedan odnos (1:1). Svaki korisnik, meĎutim, može rezervirati više apartmana.
Takva veza je poznata kao jedan-na-više odnos (1:N).
Na slici 2 prikazan je relacijski model podataka raĎen za potrebe kolegija Programiranje za
internet, naziv projekta: Iznajmljivanje apartmana.
Slika 2. Relacijski model podataka
Model u MVC arhitekturi obično se sastoji od Modela područja (Domain Model, Md) i
Modela aplikacije (Application Model, Ma). Domain Model sadrži glavne objekte koji
opisuju problem (npr. korisnici, rezervacija, mjesto, itd.), dok se Application Model sastoji od
tehničkih objekata potrebnih za izradu aplikacije (npr. popis registriranih korisnika, sučelje za
unos podataka o apartmanima, itd.).
Domain Model obično se povezuje s bazom podataka jer se objekti iz Domain Modela
prikazuju u bazi i o njima se podaci pohranjuju u bazi. Ovisno o potrebama koje se javljaju u
pojedinim fazama razvoja informacijskog sustava, razlikuju se tri vrste modela podataka:
1. konceptualni model podataka
2. logički model podataka
3. fizički model podataka
9
Konceptualni model sadrži samo prikaz naziva entiteta (tj. tablica) u bazi njihovih veza.
Odražava način na koji korisnici budućeg informacijskog sustava shvaćaju dogaĎaje u
sustavu, a zatim i podatke koji proizlaze iz takvih dogaĎaja. Logički model sadrži još nazive
atributa u tablicama, primarnih i stranih ključeva. Stvaraju ga i koriste stručnjaci informatičari
(projektanti) kao osnovu za oblikovanje i razvoj informacijskih sustava. Fizički model sadrži
sve stupce u tablicama i tipove podataka u pojedinim stupcima. Predstavlja način na koji stroj
(elektroničko računalo) „vidi“ podatke pohranjene u njegovoj memoriji.
Dakle, Model dio MVC arhitekture sadrži informacije o objektima (klasama, svojstvima,
entitetima u bazi podataka i vezama), te sve ostalo što ulazi u Model područja (Domain
Model) i Model aplikacije (Application Model). Ovaj dio ne posjeduje znanje o vezama s
vanjskim svijetom, tj. ne bavi se vezama s okolinom.
3.3.
Pogled (View)
Pogled predstavlja bilo kakav prikaz podataka kao što je obrazac, tablica ili dijagram. Bavi se
načinom prikaza informacija korisniku ili aplikaciji, tj. odgovara na pitanje kako će se nešto
prikazati korisniku ili drugoj aplikaciji, a sadrži sučelja koja su veza s modelom (s prvim
dijelom arhitekture sustava). S obzirom da u aplikaciji obično postoji više sučelja, ovaj dio
često se naziva u množini: Views (pogledi).
Ti pogledi obično se odnose na prozore za komunikaciju, a mogu biti (Deacon, 2012.):
 Pogled na grafičko korisničko sučelje (GUI view)
 Pogled na komandnu liniju (Command line view)
 Pogled na aplikacijsko programsko sučelje (API view)
Dakle, sučelja ne moraju nužno biti grafička.
10
3.4.
Kontroler (Controller)
Kontroler u osnovi prima zahtjeve korisnika. Kontroler je objekt koji upravlja pogledima.
Pojednostavljeno se može reći da kontroler kontrolira input, dok pogledi (views) kontroliraju
output (kako će nešto izgledati u prozoru). Da bi mogli upravljati inputom, kontroleri moraju
poznavati na kojoj se platformi, tj. operacijskom sustavu i bazi radi u aplikaciji. Pogledi
nasuprot tome ne moraju to poznavati.
Primjeri zahtjeva koji pripadaju u kontroler:
 Kada korisnik u web preglednik upiše adresu: http://www.fpmoz.ba/new/ želimo da se
prikaže stranica s osnovnim informacijama o Fakultetu prirodoslovno-matematičkih i
odgojnih znanosti.
 Ako koristimo web obrazac za kontaktiranje neke tvrtke, kada kliknemo na dugme
„Pošalji“, želimo da se naša poruka pošalje na e-mail adresu primatelja ili spremi u
datoteku.
3.5.
Prednosti MVC arhitekture
Osnovna prednost MVC arhitekture je razdvajanje projekta na smislene i odvojene cjeline, što
predstavlja veliku prednost pri izradi velikih projekata na kojima radi više osoba. Iz toga
proizlazi i druga prednost koja se odnosi na izmjenu, nadogradnju i budući razvoj. Ovakav
pristup omogućava laganu izmjenu jednog od elemenata bez velike intervencije u druge
elemente, kao i ponovo korištenje već napravljenih elemenata. Tako, npr., pri promijeni
vizualnog identiteta web stranice možemo promijeniti samo View element bez izmjena
funkcionalnosti, što uvelike olakšava održavanje i odgaĎa potrebu za izradu novog rješenja.
U ovakvoj arhitekturi Model je tijelo, View su oči, a Controller je mozak projekta.
MVC okvir ima osnovni cilj pružiti alate i metode za dizajniranje Modela, Pogleda i
Kontrolera. Dodatni ciljevi MVC okvira su (Pluralsight, 2012.):
 Prigrliti web (povezati aplikaciju sa HTML, CSS I JavaScript tehnologijama, čije se
naredbe automatski generiraju prilikom izrade aplikacije)
11
 Izgraditi i pokretati aplikacije u ASP.NET okolini, koja omogućuje izgradnju,
debuggiranje i generiranje izvršnog koda aplikacije
 Omogućiti proširive (eng. extensible) aplikacije
 Omogućiti testabilne (eng. testabile) aplikacije, koje će se lako moći testirati
Primjer MVC: Dijelovi MVC aplikacije koja će na web stranici prikazivati popis raspoloživih
apartmana za rezervaciju:
 Popis naziva smještaja i sadržaj smještaja = Model
 Zahtjev korisnika da se na web stranici prikaže popis naziva smještaja i sadržaj
smještaja = Kontroler
 Zahtjev korisnika da se na web stranici taj popis prikaže u obliku tablice = Pogled
Slika 3. MVC obrazac
MVC arhitekturu možemo realizirati na više modificiranih načina, za web je iskorišteno
sljedeće rješenje (slika 3):
12
Slika 4. MVC arhitektura za web
Na ovaj način zahtjevi se usmjeravaju Controller klasi koja obraĎuje korisnikov unos i radi s
modelom.
Pritom Model sadržava detalje relevantne za model kao što su objekti i pravila baze, a
Contoller sadrži aplikacijsku logiku i ostale tehničke detalje kao što su autorizacija i
višejezičnost. Nakon što obradi zahtjev Contoller priprema podatke za prezentaciju
(prezentacijski model), odabire potrebni View i njegov zadatak je završen. S obzirom na to da
Controller klase nisu vezane s ulazno-izlaznim sučeljem, one su čista aplikacijska logika i
mogu se lako testirati po potrebi. View je iskorišten za pretvaranje prezentacijskog modela u
gotovi HTML. Sadrži osnovnu prezentacijsku logiku, kao što je izlistavanje objekata po
redovima ili pokazivanje i skrivanje odreĎenih dijelova stranice. Rad s prezentacijskim
modelom bi se trebao obavljati na prethodnoj Controller razini, jer se ime koristi puna snaga
ovakve arhitekture.
13
3.6.
Nedostaci MVC arhitekture
MVC ima, naravno, i svoje nedostatke. Previše je kompleksan za implementaciju kod razvoja
manjih aplikacija i njegovo korištenje u tim slučajevima dovodi do pogoršanja kako samog
dizajna, tako i performansi. Ponekad se može dogoditi da uslijed čestih promjena modela
pogled bude preplavljen zahtjevima za izmjenu. Ukoliko on služi za prikazivanje sadržaja
kojem je potrebno odreĎeno vrijeme za izmjenu, često zahtjevi mogu dovesti do kašnjenja.
3.7.
Varijante Model-View-Controller uzorka
Model-View-Controller uzorak može biti implementiran u dvije varijante: pasivni Model
(engl. Passive Model) i aktivni Model (engl. Active Model).
Kod pasivnog Model-a jedan Controller ekskluzivno upravlja modelom, što znači da model
ne može promijeniti svoje stanje bez da u tu operaciju bude uključen Controller. Nakon što
Contoller promijeni stanje Model-a obavještava View o nastalim promjenama koji zatim može
osvježiti prikazane podatke. U ovoj varijanti Model-View-Controller uzorka Model je potpuno
neovisan o Contoller-u i View-u, što znači da isti ne mora prijavljivati promjene koje su
izvršene na njemu.
U slučaju aktivnog Model-a moguće je da Model promijeni svoje stanje bez da je u tu
operaciju uključen Controller. Takav se slučaj može dogoditi na način da više Controller
komponenti u isto vrijeme mijenjaju stanja Model komponente ili kada neke druge
komponente unutar aplikacije takoĎer imaju pravo na mijenjanje Model komponente. Budući
da u takvoj situaciji samo Model ima saznanja o promjenama koje su nastale, jedino on može
obavijestiti View o nastalim promjenama. MeĎutim, to je u kontradikciji s glavnom
karakteristikom Model komponente, a to je nezavisnost u odnosu na Controller i View, te se u
tom slučaju koristi Observer implementacijski uzorak koji ima mehanizam slanja obavijesti o
promjenama bez izravne veze s drugim objektima. Svaki View implementira Observer sučelje
i registrira se kod Model komponente s namjerom da prima obavijesti o promjenama. Model
sadržava listu svih registriranih View komponenti, ali ne zahtjeva nikakve posebne
informacije o pojedinoj View komponenti. Kada se dogodi promjena Model obavještava sve
registrirane promatrače (engl. Observer) što u konkretnom slučaju znači View komponente.
14
Implementacija aktivnog Model-a prikazana je na slici 5.
Slika 5. Konceptualni pogled: Dijagram razreda aktivnog modela MVC uzorka
Web aplikacije koje su izvedene korištenjem Model-View-Controller uzorka su primjer
pasivnog Model-a. Kod web aplikacija View se nalazi na korisničkoj strani, dok se Model i
Controller nalaze na strani poslužitelja, a meĎusobno su povezani HTTP protokolom. Svi
zahtjevi su inicirani od strane korisnika, a server u ovisnosti o zahtjevu šalje odgovarajući
odgovor. U takvom okruženju je nemoguće da server samoinicijativno pošalje obavijest
korisnikovom pregledniku o promjeni unutar Model komponente, te je jedino moguće rješenje
implementacija pasivnog Model-a. U ovakvoj situaciji Controller prestaje biti sekundarna
komponenta i otvaraju se brojne mogućnosti za nadogradnju i prilagodbu ovog uzorka za web
aplikacije.
15
4. PHP (Personal home page/Hypertekst Pretprocessor)
4.1. Razvoj programskog jezika PHP
Priča o PHP-u počinje 1995. kada je Rasmus Lerdof iz potrebe da prati broj posjeta na svojoj
online biografiji razvio niz CGI (Common Gateway Interface) alata razvijenih u Perl
programskom jeziku. Ubrzo je ovaj jezik prihvaćen i od drugih programera. Prije PHP-a,
kakvog ga poznajemo danas, ovo je bio jedini način da se web stranicama unese malo
dinamike, jer HTML kao takav samo je način prezentacije podataka. Svakako razvoj ovakvih
aplikacija nije bio lagan. U daljnjem razvoju PHP-a postojeći programi su ponovo napisani
kao niz binarnih izvršnih datoteka napisanih u C programskom jeziku te dodani elementi za
pristup bazama podataka i radu na web formama. PHP je pretrpio četiri značajne promjene
dok nije dosegao složenost i fleksibilnost kakvu danas poznajemo. U studenom 2007. godine
koristio se u preko 21 milijun domena širom svijeta, a taj broj neprekidno raste.
Slika 6. PHP: Hypertext Pretprocessor
4.1.1. PHP/FI
Kada se ukazala potreba za novim funkcijama, Rasmus je napisao znatno veći broj aplikacija
u C programskom jeziku. Uz ostalo dodao je i funkcije za komunikaciju s bazama podataka.
Aplikaciju je nazvao Personal Home Page/Forms Interpreter odnosno PHP/FI. Ona je
omogućavala kreiranje jednostavnih dinamičkih stranica na webu. Rasmus Lerdorf odlučio je
javno objaviti PHP/FI Personal Home Page Tools (PHP Tools) verziju 10. lipnja 1995. godine
kako bi ovu aplikaciju svi mogli javno koristiti i sudjelovati u njenom budućem razvoju i
poboljšanju. Verzija PHP/FI sadrži osnovne karakteristike koje PHP ima i danas.
16
Varijable koristi na način Perla, automatskim interpretiranjem varijabli primljenih iz HTTP
formi te omogućava uključivanje HTML sintakse. Sintaksa je bila jako slična Perlu, uz nešto
ograničenja i pojednostavljenja, ali s dosta nekonzistentnosti.
4.1.2. PHP/FI 2.0
Godine 1997. pojavilo se drugo izdanje PHP/FI-a – verzija 2.0, napisana u programskom
jeziku C. Tada ga je koristila skupina od nekoliko tisuća ljudi širom svijeta na oko 50 000
stranica što je u tom trenutku predstavljalo oko 1% internetske domene. Iako je već nekoliko
ljudi intenzivno sudjelovalo u razvoju, to je i dalje bio uglavnom projekt koji je kreirao jedan
čovjek. PHP/FI 2.0 službeno je izdan u studenom 1997. godine, nakon što je dugo bio u beta
izdanju.
4.1.3. PHP 3
PHP 3 je prvo izdanje koje sliči današnjem izdanju PHP-a, a stvorila su ga dva izraelska
programera – Andi Gutmans i Zeev Suraski 1997. godine prepisujući kompletni PHP/FI 2.0
jer nije zadovoljavao u razvoju njihovih e-commerce web aplikacija. Andi, Rasmus i Zeev
odlučili su suraĎivati u zajedničkom razvoju PHP 3.0 kao službenog nasljednika PHP/FI 2.0.
Tako je nastao novi programski jezik nazvan „PHP“ što je danas skraćenica od Hypertext
Pretprocesor. Jedna od najvećih kvaliteta PHP 3.0 bila je mogućnost dodavanja novih
proširenja. Zbog mogućnosti uporabe različitih baza podataka, protokola i API-a kao i
mogućnosti proširenja privukla je još više programera koji su razvijali daljnje module za
funkcionalna proširenja. Ključ je uspjeha PHP 3.0, dakle, mogućnost modularnih proširenja,
objektno orijentirana sintaksa i poboljšana jezična sintaksa. Stabilnija verzija PHP 3.0
službeno je izdana u lipnju 1998. godine nakon otprilike 9 mjeseci testiranja. Tijekom 1998.
godine skupina PHP korisnika širi se na desetke tisuća korisnika i stotine tisuća web
poslužitelja zauzimajući pri tome udio od oko 10% svih internetskih poslužitelja.
4.1.4. PHP 4
U zimu 1998. godine, kratko nakon službenog izdanja PHP 3 verzije, Andi Gutmans i Zeev
Suraski počeli su rad na rekonstrukciji PHP jezgre. Ciljevi su bili poboljšati karakteristike
kompleksnih aplikacija i još više povećati modularnost PHP-a. Novi PHP interpreter, nazvan
Zend Engine (po dijelovima svojih imena Zeev and Andi), postigao je zadane ciljeve i
17
predstavljen je prvi put sredinom 1999. godine. PHP 4.0, baziran na novom interpreteru s
novim proširenjima, izdan je službeno u svibnju 2000. godine, skoro dvije godine nakon
pojave PHP 3. Osim poboljšanja jezgre i novih ekstenzija, značajne novosti bile su podrška za
još više web poslužitelja, HTTP sesije, output buffering i sigurniji način rukovanja
korisničkim podacima.
4.1.5. PHP 5
Nakon dužeg razvoja i više predverzija u srpnju 2004. godine objavljena je nova verzija PHP 5. Jezgra PHP 5 je Zend Engine 2.0. Verzija PHP 5 je u potpunosti stabilna i sadrži još
više modula za podršku raznim novim tehnologijama (npr. XML Extensible Markup
Language), što omogućava potpuno objektno orijentirano programiranje (prema uzoru na
Javu).
4.2.
Kako zapravo radi PHP?
Programeri pišu PHP skripte koje se spremaju na web poslužitelj. Web poslužitelj sadrži PHP
interpreter koji prevodi kod – nastaje dinamička Web stranica koju korisnik može vidjeti u
svom Internet pregledniku. Web stranica može biti izgraĎena na bazi podataka (npr. MySQL
baza podataka). Kada klijent pošalje zahtjev web poslužitelju za dinamičkom PHP web
stranicom, poslužitelj je konfiguriran kako bi mogao prepoznati ekstenziju .php te prosljeĎuje
datoteku PHP interpreteru koji dalje prosljeĎuje SQL upit poslužitelju.
Nakon obrade upita rezultati se vraćaju poslužitelju te se na kraju prikazuju u pregledniku
klijenta. Iako se predstavlja kao jezik za programiranje na strani poslužitelja, PHP je mnogo
više od toga. Može se koristiti na svim važnijim operacijskim sustavima – Linux, Unix,
Windows, MacOS te podržava većinu proceduralno i objektno orijentirano programiranje te
korisnik ima potpunu slobodu izbora.
Tri su glavna područja primjene PHP-a:

Programiranje na strani poslužitelja – već je spomenuto glavno područje primjene.
Da bi ovo funkcioniralo, potrebno je imati PHP interpreter, web poslužitelj te web
preglednik. Kod se izvršava na web poslužitelju na kojem je instaliran PHP.
18

Command line programiranje – PHP skripta se može izvršavati bez poslužitelja ili
preglednika. Ovaj tip korištenja je idealan za skripte koje se redovito izvršavaju
koristeći cron (Unix/Linux) ili Task Scheduler (Windows).

Pisanje desktop aplikacija – iako nije najbolji izbor za ovakav tip posla, neke
napredne mogućnosti za programiranje na strani klijenta se mogu koristiti i za izradu
desktop aplikacija.
Jedna od najvažnijih osobina PHP-a je podrška za mnoge baze podataka. Programiranje web
stranica koje koriste baze podataka je jako jednostavno zahvaljujući upravo PHP-u. Najčešće
se PHP koristi u kombinaciji s MySQL bazama podataka. Ne treba zaboraviti ni podršku za
komunikaciju s drugim uslugama koristeći protokole kao LDAP, IMAP, SNMP, NNTP,
POP3, HTTP, COM i mnoge druge.
Ovdje vidimo primjer jedne jednostavne PHP skripte. Poslužitelj će izvršiti navedeni PHP kod
te će ga korisnik vidjeti u njegovom krajnjem obliku „Pozdrav! Ovo je PHP skripta!“ u web
pregledniku. U praksi je korištenje PHP-a, naravno, mnogo složenije.
Slika 7. Primjer jednostavne PHP skripte
19
4.3.
Osnovne karakteristike PHP-a
PHP je serverski skriptni jezik opće namjene izvorno dizajniran za izradu dinamičkih web
stranica. To je jedan od prvih serverskih skriptnih jezika koji se mogao ugraditi u izvorni
HTML dokument, umjesto pozivanja vanjske datoteke za obradu podataka. Unutar HTML
stranica može se ugraditi PHP kod koji se izvršava kada posjetitelj web lokacije zatraži
odreĎenu stranicu. Web server tumači PHP kod ugraĎen u stranicu i generira HTML kod ili
neku drugu vrstu izlaznih podataka koje posjetitelj stranice može vidjeti. S vremenom, PHP je
dobio mogućnost tekstualnog sučelja, a može se koristiti i u izradi grafičkih aplikacija. PHP
djeluje prvenstveno kao filter. Njegov ulaz je datoteka ili tekstualni niz, a njegov izlaz
predstavlja novi niz podataka koji je najčešće HTML dokument.
PHP može biti implementiran na većini web poslužitelja ili kao samostalna ljuska na gotovo
svakom operacijskom sustavu i platformi. Instaliran je na više od 20 milijuna web domena i
na preko 1 milijun web poslužitelja, što ga je pozicioniralo kao ozbiljnog konkurenta sličnim
skriptnim jezicima poput Microsoft-ovog Active Server Pages (ASP) i Sun-ovog Java Server
Pages (JSP), a koriste ga i mnoge značajne web aplikacije kao što su Wikipedia, Facebook,
Digg, Joomla i Wordpress.
PHP je projekt otvorenog koda, što znači da imate pristup izvornom kodu koji možete
koristiti, mijenjati i dalje distribuirati potpuno besplatno.
PHP je prvobitno bila skraćenica za Personal Home Page, ali je značenje kasnije izmijenjeno
u skladu s rekurzivnim GNU (GNU = Gnu's Not Unix) pravilima za davanje imena tako da je
PHP sada skraćenica za PHP: Hypertext Pretprocesor. PHP je prvi programski jezik koji je
bio ugraĎen unutar HTML stranice mijenjajući njen sadržaj i na kraju generirajući konačni
sadržaj. Na osnovu navedenog možemo reći da po definiciji nije programski nego skriptni
jezik.
Danas ne možemo reći da je Perl prethodnik PHP-a jer je PHP u potpunosti ponovo napisan u
C programskom jeziku. PHP je besplatan software izdan pod PHP licencom i u potpunosti je
neovisan o operacijskom sustavu, tj. može se izvršavati na bilo kojem operacijskom sustavu
(Linux, Windows, Mac, …)
20
TakoĎer, PHP je vrlo modularan kada su u pitanju ekstenzije, bilo da su pisane u C-u (PECL)
ili niz klasa u PHP-u (PEAR). Danas je PHP izrastao u jako popularan skriptni jezik za razvoj
čak i jako kompleksnih projekata te je u kombinaciji sa MySQL-om postao jako popularan
alat (force to be reckoned with).
PHP je izvorno implementiran kao interpreter. Naknadno je razvijeno nekoliko prevoditelja
(engl. compiler) koji omogućavaju veću brzinu izvršavanja, statičku analizu i poboljšanu
interoperabilnost s dijelovima koda pisanim u drugim jezicima. Poznatiji prevoditelji za PHP
su Phalanger koji prevodi PHP u Common Intermediate Language (CIL) byte-kod i HipHop
(razvio ga je Facebook i sada je dostupan kao open source) koji pretvara PHP skripte u C++
kod, a zatim ga prevodi čime se opterećenje poslužitelja smanjuje i do 50%.
PHP uključuje mnoge besplatne i open source biblioteke. Pomoću njih se ostvaruje pristup
mnogim mrežnim servisima poput poslužitelja baza podataka, FTP, LDAP, POP3, IMAP,
SNMP, NNTP i brojnih drugih poslužitelja. Mnoge funkcije poznate u programskom jeziku C
dostupne su i u standardnom PHP jeziku. Moguće je i pisanje proširenja u C jeziku za
dodavanje nepostojećih funkcionalnosti u PHP jezik poput dinamičkog generiranja fotografija
i Adobe Flash sadržaja, pa čak i sinteze govora. Projekt PHP Extension Community Library
(PECL) predstavlja repozitorij ekstenzija PHP jeziku.
Ovaj programski jezik namijenjen je za izradu dinamičkih i interaktivnih stranica na webu. To
je serverska tehnologija (kao što su Perl, ASP ili ColdFusion) što znači da se on izvršava na
web serveru. Njegovim izvršavanjem kreira se dio web stranice (ili cijela stranica) koji se
potom šalje korisniku i bude vidljiv u njegovom pretraživaču.
PHP omogućava interakciju korisnika s web stranicama. Na „statičnim“ stranicama
komunikacija je jednosmjerna: korisnik klikom na neki link dobije pogled na odreĎeni
sadržaj. Da bi korisnik mogao na bilo koji način utjecati na sam sadržaj neke web stranice
potrebna je primjena neke serverske tehnologije.
PHP se može instalirati na većini web poslužitelja, mnogim operacijskim sustavima i
platformama kao što su Linux, Microsoft Windows, Mac OS, Solaris i OpenBSB, a posebno
je naglašena mogućnost spajanja s velikim brojem relacijskih sustava za upravljanje bazama
podataka (RDBMS). Dostupan je besplatno, a „The PHP Group“ korisnicima nudi potpuni
izvorni kod za razvoj, prilagodbu i proširenja prema vlastitim potrebama.
21
4.4.
Prednosti PHP-a
Glavni konkurenti PHP-a su Perl, Microsoftov ASP.NET, Ruby (on Rails ili drugačiji), JSP
(Java Server Pages) i ColdFusion. U usporedbi s navedenim tehnologijama, PHP ima više
prednosti s obzirom na:
 Performanse: PHP je vrlo brz. Jedan relativno jeftin server može obraditi milijun
zahtjeva dnevno. Rezultati testova koje je objavila tvrtka Zend Technologies
(http://www.zend.com) dokazuju da PHP nadmašuje svoje konkurente.
 Proširivost: PHP ima ono što njegov autor, Rasmus Lerdorf, često naziva „sharednothing“ arhitektura. To znači da možete efikasno i jeftino horizontalno proširiti
sustav na veliki broj običnih, jeftinih servera za podatke.
 Integriranost sa sustavom za upravljanje bazama podataka: PHP standardno
omogućava uspostavljanje veza s više sustava za upravljanje bazama podataka. Osim s
MySQL-om, moguće je uspostavljanje direktnih veza sa sustavima PostgreSQL,
mSQL, Oracle, dbm, FilePro, DB2, Hyperwave, Informix, InterBase i Sybase, itd.
Pomoću standarda ODBC (Open Dataabse Connectivity) mogu se uspostavljati veze
sa svakom bazom podataka za koju postoji ODBC upravljački program. To vrijedi za
Microsoftove proizvode, kao i za mnoge druge. Pored biblioteka, PHP ima i sloj
apstrakcije za pristup bazama podataka koji se zove PHP Database Objects (PDO) koji
omogućava konzistentan pristup bazama podataka i pospješuje pisanje koda.
 UgraĎene biblioteke: Budući da je projektiran za upotrebu na Webu, PHP sadrži
brojne funkcije koje omogućavaju obavljanje mnogih poslova potrebnih u Web
aplikacijama. Možete generirati slike tijekom rada aplikacije, koristiti XML
dokumente, slati poruke e-poštom, raditi s kolačićima, generirati dokumente u formatu
PDF – i sve to pomoću nekoliko redova programskog koda.
 Niska cijena: PHP je besplatan. (Najnoviju verziju uvijek je moguće preuzeti s adrese
http://www.php.net, potpuno besplatno).
 Lako se uči: Sintaksa PHP-a slična je sintaksama drugih programskih jezika,
prvenstveno jezika C i Perl.
 Podrška za objektno orijentirano programiranje: Verzija PHP 5 donosi objektno
orijentirane mogućnosti. Slično kao kod programiranja u programskim jezicima Java
ili C++, mogu se prepoznati elementi i sintaksa kao što su nasljeĎivanje, privatni i
zaštićeni atributi i metode, apstraktne klase i metode, konstruktori, destruktori i slično.
22
Postoje i neke rjeĎe korištene mogućnosti poput, na primjer, upotrebe iteratora. Dio
opisane funkcionalnosti bio je na raspolaganju već u verzijama PHP-a 3 i 4, ali je u
verziji 5 ona znatno dopunjena.
 Prenosivost: PHP je na raspolaganju za mnoge operacijske sustave. PHP kod moguće
je pisati jednim od Unix operacijskih sustava, kao što su Linux i FreeBSD, pod
komercijalnim verzijama Unixa kao što su Solaris i IRIX, OS X, ili pod raznim
verijama Microsoftovog Windowsa. Napisani kod u nekom operacijskom sustavu
najčešće se nastavlja raditi bez izmjena u drugom operacijskom sustavu u kojem je
instaliran PHP.
 Fleksibilnost pristupa razvoju aplikacija: U PHP-u se mogu lako realizirati jednostavni
zadaci, a isto tako i velike aplikacije uz upotrebu frameworka zasnovanog na
projektnim obrascima kao što je MVC arhitektura.
 Izvorni kod: Izvorni kod u PHP-u javno je dostupan. Za razliku od komercijalnih
proizvoda zatvorenog koda, na jednostavan način je moguće izmijeniti ili dodati PHP
programskom kodu. Nije potrebno čekati da proizvoĎač objavi servisne pakete niti
brinuti o tome hoće li proizvoĎač bankrotirati ili prestati podržavati proizvod.
 Dostupnost
podrške
i
dokumentacije:
Tvrtka
Zend
Technologies
(http://www.zend.com), koja je autor stroja na kojem se zasniva PHP, financira razvoj
PHP-a zaradom od podrške i srodnog softvera koji distribuira na komercijalnoj osnovi.
Dokumentacija o PHP-u i zajednica korisnika PHP-a ozbiljni su i bogati resursi
informacija koje je danas moguće besplatno koristiti.
4.5.
Razvoj velikih aplikacija u PHP-u
Bilo tko da je pokušao napraviti bilo kakvu aplikaciju u PHP-u, vjerojatno se uvjerio da je
razvoj aplikacija u PHP-u prilično jednostavan te kao takav PHP se ubraja u jedan od onih
programskih jezika koje je jednostavno naučiti, ali teško savladati (easy to learn, hard to
master). Ponekad razvoj velikih aplikacija zahtjeva odreĎenu metodologiju razvoja,
poznavanje osnovnih principa programskog inženjerstva.
Vrlo lako se može dogoditi da se naĎemo u situaciji gdje više vremena potrošimo ispravljajući
pogreške koje smo napravili nego na samu izradu aplikacije. Pri tome se tu ne radi samo o
poznavanju strukture programskog jezika, jer koliko god dobro poznavali neki programski
jezik, ipak smo ljudi, a ljudi griješe.
23
Iako u tome nema ništa loše, osim gubitka vlastitog vremena, neke greške se skupo plaćaju,
barem u profesionalnom razvoju aplikacija. Da bi se izbjegla takva situacija ponekad je bolje
koristiti pristup (think twice code once) „Čitaj dva puta, kodiraj jednom“.
Programski jezik PHP se već više od 10 godina koristi za izradu dinamičkih web sjedišta.
Inicijalno su se dinamičke stranice stvarale uz pomoć jezika HTML, a dinamičke
karakteristike dodavao je programski jezik PHP koji se uklapao u postojeću HTML stranicu.
Ovakvo ispreplitanje dvaju programskih jezika je predstavljalo pogodnost budući da se na
jednostavan način dodavala funkcionalnost web sjedištima. Kroz inačice 3 i 4, programski
jezik PHP stekao je veliku popularnost u zajednici otvorenog koda. Kako je popularnost
jezika rasla, bilo je neizbježno nastajanje sve većih i većih aplikacija koje su temeljene na
ovom jeziku.
Ubrzo je postalo jasno da isprepletanje dvaju programskih jezika nije predstavljalo dugoročno
rješenje za velike web aplikacije. Problemi se očituju u skalabilnosti i održavanju velikih
projekata. Točnije, puno je teže dodavati nove funkcionalnosti i ispravljati programske greške
(eng. bug) ukoliko se funkcijski dio koda nalazi zajedno sa HTML prikazom. Jedno svojstvo
web aplikacija je često mijenjanje grafičkog sučelja, odnosno izgleda. Ukoliko se funkcijski
dio koda usko veže uz HTML nije moguće zamijeniti izgled stranice bez mijenjanja postojeće
funkcionalnosti koda. U cilju rješavanja ovog problema nastala su razvojna okruženja, a neka
od najpopularnijih razvojnih okruženja za programski jezik PHP su Cake PHP, CodeIgniter,
Yii, Symfony i Zend framework. Razvojna okruženja općenito služe za potporu izgradnje i
testiranja dinamičkih web stranica, web aplikacija i usluga. TakoĎer, pomažu u razrješavanju
učestalih problema koji se pojavljuju prilikom projektiranja web aplikacija. Često okruženja
nude gotov skup biblioteka i alata za pristup bazi podataka, izradu i upravljanje predlošcima,
upravljanje korisničkom sjednicom te olakšavaju ponovnu uporabu programskog koda.
Mnoga razvojna okruženja prate arhitektonski obrazac MVC (engl. Model-View-Controller)
koji omogućuje razdvajanje modela podataka s poslovnom pravilima od korisničkog sučelja.
Ovo svojstvo se općenito smatra dobrom praksom obzirom da modularizira kod, potiče
ponovnu uporabu koda i omogućuje više sučelja koji se mogu primjenjivati. Razvojna
okruženja stvorena su s ciljem jednostavnijeg stvaranja i održavanja velikih web aplikacija
zasnovanih na PHP programskom jeziku. Sadrže bogat skup gotovih komponenti koje
pokrivaju velik dio učestalih potreba prilikom izrade web aplikacija.
24
4.6.
Usporedba PHP-a s drugim programskim jezicima
PHP vs ASP
Iako su PHP i ASP po mnogočemu slični, razlikuju se u četiri dosta bitne kategorije, a to su:
 Cijena: Sam ASP je besplatan, no da bismo ga koristili, potrebno je imati IIS server
koji je podržan na nekim od Windows operacijskih sustava. Najčešće se u ASP
aplikacijama koristi MS SQL Server koji takoĎer ima svoju cijenu. Veliki problem se
javlja ukoliko bismo ga željeli pokrenuti na drugim platformama ili serverima.
S druge strane, programiranje u PHP-u ne košta ništa, a popularne baze podataka za
PHP su besplatne (MySQL i PostreSQL).
 Platforma: Korištenje ASP aplikacija je ograničeno na Windows platformu, dok se
PHP aplikacije vrte na svim platformama.
 Programerska zajednica: ASP ima svoju zajednicu na MSDN-u, ali je često teško doći
do zaista korisnih stvari besplatno na internetu. Nasuprot tome, za PHP postoji mnogo
tutoriala, članaka, foruma i slično.
 Brzina: ASP je sporiji u izvoĎenju od PHP-a.
Ipak, osnovna razlika je u tome što ASP sam po sebi nije jezik već skupina povezanih
objekata kojima možemo pristupiti pomoću VB ili JavaScripta. Veliki problem kod ASP-a je
što je programer ograničen samim jezikom koji je podijeljen na „komponente“ te ukoliko
želimo šire mogućnosti morali bismo ASP nadograĎivati dodatnim komponentama, a to
zapravo znači dodatne troškove.
PHP vs Perl
Iako ova dva jezika imaju dosta sličnosti, ipak postoji više razlika. Glavna razlika je ta što je
PHP namijenjen prije svega za pisanje web skripti, dok Perl ima dosta širu upotrebu. Samim
time ima i složeniju sintaksu od PHP-a što ga čini težim za naučiti i savladati u odnosu na
PHP. Unatoč široj upotrebi Perl-a, PHP koristi neke dobre osobine Perla poput konstruktora te
nekih sintaktičkih osobina.
Ukratko rečeno, Perl je programski jezik čije je ime kratica od eng. „Practical Extraction and
Report Language“. Originalni autor Perla je Larry Wall, a prva inačica pojavila se 18.
Prosinca 1987. godine. Perl vuče svoje korijene iz drugih jezika kao što su primjerice C, sed,
awk i Unix shell. Odlikuje ga kvalitetan repozitorij gotovih programskih rješenja (CPAN –
25
kratica od eng. „Comprehensive Perl Archive Network“) što mu je ujedno i glavna prednost u
odnosu na konkurentske jezike.
Perl je prema svojim karakteristikama objektno orijentirani interpreterski programski jezik
opće namjene s naglaskom na funkcionalnost, proširivost te laganu krivulju učenja. Perl je bio
jezik izbora za razvoj WWW aplikacija sredinom 90-ih godina. Os samih svojih početaka to
je jezik Unix i Linux sistemskih administratora koji ga koriste u svakodnevnom radu
prvenstveno za automatizaciju procesa. Danas postoji i čitav niz korisničkih komercijalnih
aplikacija pisanih u Perlu.
4.7.
Struktura PHP web aplikacije bez korištenja MVC arhitekture
26
Slika 8. Direktorij PHP web aplikacije
27
apartmani_objekti.php
<?php
require("config.php");
include("header.php");
include("html_head.php");
include("menu.php");
if (isset($_COOKIE['uname'])){
$prijavljen=true;
$tip_korisnika=$_COOKIE['tip_korisnika'];
}
function IspisApartmana(){
global $dbhost, $dbuser, $dbpass,$dbname;
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error
connecting to
mysql');
mysql_select_db($dbname);
echo "<h2>Pregled apartmana</h2>";
$sql="SELECT ID_objekta, naziv_objekta, vlasnik, adresa, telefon, email, web,
broj_soba, udaljenost_od_mora, udaljenost_od_centra, status, naziv_mjesto, status
FROM `apartmani_objekti`
NATURAL JOIN mjesto
ORDER BY ID_objekta";
$result=mysql_query($sql);
echo "<table class=\"sample\"><tr><th> ŠIFRA </th><th> NAZIV </th><th> VLASNIK
</th><th> ADRESA </th><th> TELEFON </th><th> EMAIL </th><th> WEB &nbsp </th><th>
BROJ </br>
APARTMANA </th><th> UDALJENOST </br>OD MORA </th><th> UDALJENOST
</br>OD CENTRA </th><th> MJESTO </th><th>; STATUS;</th><th></th><th></th></tr>";
while($ispisrez = mysql_fetch_array($result)){
echo "<tr>";
echo "<td>".$ispisrez['ID_objekta']."</td>";
echo "<td>".$ispisrez['naziv_objekta']."</td>";
echo "<td>".$ispisrez['vlasnik']."</td>";
echo "<td>".$ispisrez['adresa']."</td>";
echo "<td>".$ispisrez['telefon']."</td>";
echo "<td>".$ispisrez['email']."</td>";
echo "<td>".$ispisrez['web']."</td>";
echo
"<td><center>".$ispisrez['broj_soba']."</center></td>";
echo
"<td><center>".$ispisrez['udaljenost_od_mora']."</center></td>";
echo
"<td><center>".$ispisrez['udaljenost_od_centra']."</center></td>";
"<td><center>".$ispisrez['parking']."</center></td>";
echo "<td>".$ispisrez['naziv_mjesto']."</td>";
// echo "<td>".$ispisrez['naziv']."</td>";
echo "<td>".$ispisrez['status']."</td>";
echo "<td><a
href=\"objekt_brisi.php?id=".$ispisrez['ID_objekta']."\"onclick=\"return
confirm('Želite li stvarno pobrisati');\">Bri&#353;i </a></td>";
echo "<td><a
href=\"objekt_promijeni.php?id=".$ispisrez['ID_objekta']."\">A&#382;uriraj</a></td
>";
echo "</tr>";
}
mysql_close($conn);
echo "</table>";
28
echo "</br></br></br><a
href=\"objekt_dodaj.php?id=".$ispisrez['ID_objekta']."\">Dodaj novi objekt</a>";
}
?>
<div id="pregled_apartmana" >
<?php
IspisApartmana()
?>
</div>
<?php
include("footer.php");
?>
objekt_dodaj.php
<?php
include("html_head.php");
include("header.php");
include("menu.php");
require("config.php");
if (isset($_COOKIE['uname'])){
$prijavljen=true;
$tip_korisnika=$_COOKIE['tip_korisnika'];
}
else {
$prijavljen=false;
}
?>
<div >
<div >
<div >
<div id="dodavanje_apartmana" > </br></br></br>
<h1> DODAVANJE NOVOG OBJEKTA APARTMANA</h1>
</div>
<div class="ana">
<form action="insertobjekt.php" method="GET" class="dodaj">
<span>NAZIV OBJEKTA: </br><input type="text" name="naziv" size="30"
maxlength="40"><span><br>
<span>VLASNIK: </br><input type="text" name="vl" size="30"
maxlength="40"><span><br>
<span>ADRESA: </br><input type="text" name="adr"size="30" maxlength="40"
><span><br>
<span>TELEFON: </br><input type="text" name="tele" size="30"
maxlength="40"><span><br>
<span>EMAIL: </br><input type="text" name="ema" size="30"
maxlength="40"><span><br>
<span>WEB: </br><input type="text" name="we" size="30" maxlength="40" ><span><br>
<span>BROJ SOBA: </br><input type="text" name="broj"size="30"
maxlength="40"><span><br>
<span>UDALJENOST OD MORA: </br><input type="text" name="od_mora" size="30"
maxlength="40"><span><br>
<span>UDALJENOST OD CENTRA: </br><input type="text" name="od_centra" size="30"
maxlength="40"><span><br>
<span>PARKING: </br><input type="text" name="par" size="30"
maxlength="40"><span></br>
<span>STATUS: </br><input type="text" name="stat" size="30"
maxlength="40"><span></br>
<span> MJESTO: </br>
29
<select name="ID_mj">
<option value="odabir" size="30" maxlength="40" >Odaberite mjesto</option>
</br></br></br>
<?php
// povezivanje
$conn2 = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to
mysql');
mysql_select_db($dbname);
echo "<h2>Pregled mjesta</h2>";
$sql2="SELECT * FROM mjesto ORDER BY ID_mjesto";
$result2=mysql_query($sql2);
while($ispisrez2 = mysql_fetch_array($result2)){
echo "<option
value=\"".$ispisrez2['ID_mjesto']."\">".$ispisrez2['naziv_mjesto']."</br></br></op
tion></br></br></br>";
echo "</br>";
}
?>
</select>
<span>
</br></br><input type="submit" name="posalji" value="Dodaj"><br>
</form>
<!-- <?php
$conn2 = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to
mysql');
mysql_select_db($dbname);
echo "<h2>Pregled objekata</h2>";
$sql2="SELECT * FROM apartmani_objekti ORDER BY 1";
$result2=mysql_query($sql2);
while($ispisrez2 = mysql_fetch_array($result2)){
echo "<option
value=\"".$ispisrez2['ID_objekta']."\">".$ispisrez2['naziv_objekta']."</option>";
while petlje
}
?>
</div>
</div>
</div>
</div>
<?php
include("footer.php");
?>
objekt_brisi.php
<?php
include("html_head.php");
include("header.php");
include("menu.php");
require("config.php");
if (isset($_COOKIE['uname'])){
$prijavljen=true;
$tip_korisnika=$_COOKIE['tip_korisnika'];
}
else {
$prijavljen=false;
}
?>
<?php
30
global $dbhost, $dbuser, $dbpass,$dbname;
if (isset($_GET['id'])) {
$sifra_objekta
=
$_GET['id'];
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to
mysql');
mysql_select_db($dbname);
$sql="DELETE FROM apartmani_objekti WHERE ID_objekta=$sifra_objekta";
$result=mysql_query($sql) or die("<h2>Pogreska kod brisanja</h2>".mysql_error());
if ($result){
echo "<h2 class='brisanje_objekta'>BRISANJE OBJEKTA SA
ŠIFROM:<b>$sifra_objekta</b>...</h2>";
}
}
?> </br>
<a href="apartmani_objekti.php" class="link_novi_popis2">Pogledaj novi popis
apartmana.</a>
objekt_promijeni.php
<?php
require("config.php");
include("html_head.php");
include("header.php");
include("menu.php");
if (isset($_COOKIE['uname'])){
$prijavljen=true;
$tip_korisnika=$_COOKIE['tip_korisnika'];
}
else {
$prijavljen=false;
}
?>
<div id="content-container">
<div id="content-container2">
<div id="content-container3">
<div id="content">
<?php
if ($tip_korisnika==2){
if (isset($_GET['azuriraj'])){
$ID_objekta
= $_GET['ID_objekta'];
$naziv_objekta
=
$_GET['naziv_objekta'];
$vlasnik
=
$_GET['vlasnik'];
$adresa =
$_GET['adresa'];
$telefon =
$_GET['telefon'];
$email =
$_GET['email'];
$web
=
$_GET['web'];
$broj_soba
=
$_GET['broj_soba'];
$udaljenost_od_mora =
$_GET['udaljenost_od_mora'];
$udaljenost_od_centra=$_GET['udaljenost_od_centra'];
$parking
=
$_GET['parking'];
$ID_mjesto
=
$_GET['ID_mjesto'];
$status =
$_GET['status'];
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to
mysql');
mysql_select_db($dbname);
$sql="UPDATE apartmani_objekti SET naziv_objekta='$naziv_objekta',
vlasnik='$vlasnik', adresa='$adresa', telefon='$telefon', email='$email',
web='$web', broj_soba='$broj_soba', udaljenost_od_mora='$udaljenost_od_mora',
31
udaljenost_od_centra='$udaljenost_od_centra', parking='$parking',
ID_mjesto='$ID_mjesto', status='$status' WHERE ID_objekta=$ID_objekta";
$result=mysql_query($sql) or die("<h2>Pogreska kod pronalaska
objekta</h2>".mysql_error());
if ($result){
echo "Uspje&#353;no a&#382;uriranje</br></br>";
echo "<a href='apartmani_objekti.php' class='novi_popis_objekata'>Pogledajte novi
popis objekata</a>";
}
}
if (isset($_GET['id'])) {
$ID_objekta =
$_GET['id'];
$conn = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to
mysql');
mysql_select_db($dbname);
$sql="SELECT * FROM apartmani_objekti WHERE ID_objekta='$ID_objekta' ";
$result=mysql_query($sql) or die("<h2>Pogreska kod pronalaska
objekta</h2>".mysql_error());
while($ispisrez = mysql_fetch_array($result)){
$trenutni_objekt=$ispisrez['ID_objekta'];
echo "<form action=\"objekt_promijeni.php\" method=\"GET\">";
echo "<span>ŠIFRA OBJEKTA: </br><input type=\"text\" name=\"ID_objekta\"
size=\"35\" maxlength=\"40\" value=\"".$ispisrez['ID_objekta']."\"
READONLY></span><br>";
echo "<span>NAZIV OBJEKTA:</br> <input type=\"text\" name=\"naziv_objekta\"
size=\"35\" maxlength=\"40\"value=\"".$ispisrez['naziv_objekta']."\"></span><br>";
echo "<span>VLASNIK: </br><input type=\"text\" name=\"vlasnik\" size=\"35\"
maxlength=\"40\" value=\"".$ispisrez['vlasnik']."\"></span><br>";
echo "<span>ADRESA: </br><input type=\"text\" name=\"adresa\" size=\"35\"
maxlength=\"40\" value=\"".$ispisrez['adresa']."\"></span><br>";
echo "<span>TELEFON:</br> <input type=\"text\" name=\"telefon\" size=\"35\"
maxlength=\"40\" value=\"".$ispisrez['telefon']."\"></span><br>";
echo "<span>EMAIL:</br> <input type=\"text\" name=\"email\" size=\"35\"
maxlength=\"40\" value=\"".$ispisrez['email']."\"></span><br>";
echo "<span>WEB: </br><input type=\"text\" name=\"web\" size=\"35\"
maxlength=\"40\" value=\"".$ispisrez['web']."\"></span><br>";
echo "<span>BROJ APARTMANA: </br><input type=\"text\" name=\"broj_soba\"
size=\"35\" maxlength=\"40\" value=\"".$ispisrez['broj_soba']."\"></span><br>";
echo "<span>UDALJENOST OD MORA:</br> <input type=\"text\"
name=\"udaljenost_od_mora\" size=\"35\" maxlength=\"40\"
value=\"".$ispisrez['udaljenost_od_mora']."\"></span><br>";
echo "<span>UDALJENOST OD CENTRA:</br> <input type=\"text\"
name=\"udaljenost_od_centra\" size=\"35\" maxlength=\"40\"
value=\"".$ispisrez['udaljenost_od_centra']."\"></span><br>";
echo "<span>PARKING: </br><input type=\"text\" name=\"parking\" size=\"35\"
maxlength=\"40\" value=\"".$ispisrez['parking']."\"></span><br>";
echo "<span>&#352;IFRA MJESTA:</br> <input type=\"text\" name=\"ID_mjesto\"
size=\"35\" maxlength=\"40\" value=\"".$ispisrez['ID_mjesto']."\"></span><br>";
echo "<span>STATUS:</br> <input type=\"text\" name=\"status\" size=\"35\"
maxlength=\"40\" value=\"".$ispisrez['status']."\"></span><br>" }
echo "</select><br></span><span><input type=\"submit\" name=\"azuriraj\"
value=\"A&#381;URIRAJ\"></span>";
echo "</form>
}
}
else {
echo "<h3>Nemate razinu za pregledavanje ovih podataka</h3><br>";
}
?>
32
</div>
</div>
</div>
</div>
rezervacija.php
<?php
require("config.php");
include("header.php");
include("html_head.php");
include("menu.php");
if (isset($_COOKIE['uname'])){
$name=$_COOKIE['uname'];
$prijavljen=true;
$tip_korisnika=$_COOKIE['tip_korisnika'];
}
if(isset($_COOKIE['id_korisnika'])){
$id_korisnik = $_COOKIE['id_korisnika'];
}
else {
$prijavljen=false;
}
if(isset($_GET['a'])){
$id_objekt= $_GET['a'];
$conn2 = mysql_connect($dbhost, $dbuser, $dbpass) or die ('Error connecting to
mysql');
mysql_select_db($dbname);
$sql="SELECT naziv_smjestaja FROM apartmani_smjestaj WHERE
ID_smjestaj=".$id_objekt;
$result=mysql_query($sql);
while($ispisrez2 = mysql_fetch_array($result))
$naziv_objekta = $ispisrez2['naziv_smjestaja'];
}
?>
<div >
<div >
<div >
<div >
</div>
<div class="ana">
<h2>REZERVACIJA</h2>
<form action="insertrezervacija.php" method="GET" class="dodaj">
<span>NAZIV SMJEŠTAJA:</br>
<?php
echo $naziv_objekta;
echo '<input type="hidden" name="idsmjestaja" value="'.$id_objekt.'">';
?>
<span>
</br>
<span>VAŠE KORISNIČKO IME:</br>
<?php
echo $name;
?>
<span></br>
<?php
33
$date_from=date('Y-m-d', time()+14*60*60*24);
$date_to=date('Y-m-d',time()+21*60*60*24);
echo '<span>DATUM OD: </br><input type="date" name="od" value="'.$date_from.
'"><span></br>';
echo '<span>DATUM DO: </br><input type="date" name="do" value="'.$date_to.
'"><span></br>';
?>
<?php
echo '<input type="hidden" name="id_korisnik" value="'.$id_korisnik.'"/>';
?>
<input type="submit" name="posalji" value="Dodaj"><br>
</form></div>
</div>
</div>
</div>
<?php
include("footer.php");
?>
34
5. MVC u web aplikacijama
5.1. Framework (radni okvir)
Posljednjih godina PHP je zahvatila struja kojom se taj skriptni programski jezik podigao na
jednu višu, profesionalniju razinu. Radi se o PHP paketima (php framework) koji služe kao
alati za brži i sigurniji razvoj Internet aplikacija. Njihova namjena je prvenstveno bila da se
gotovi alati iz jedne tehnologije sastave u jedan praktični okvir pa da se tako nastali paket
koristi kao jedan kompletan alat. Tako bi programer bez razmišljanja imao na raspolaganju
osnovne funkcionalnosti tehnologije koju koristi i posvetio se samo logici aplikacije koju
gradi, problemima organizacije datoteka, klasifikacije objekata i slično.
Termin okvir (engl. framework) se vrlo često koristi u softverskom inženjerstvu, posebno
kada se govori o projektiranju i implementaciji objektno orijentiranog softvera.
Najjednostavnije, okvir se može definirati kao generator aplikacija odreĎene domene, ili
konkretnije, okvir predstavlja kostur aplikacije, koji sadrži kompletan kod osnovnih funkcija
cijelog sustava, a koji se može prilagoditi za potrebe odreĎene aplikacije2.
Framework je skup klasa (i/ili programa) koje funkcioniraju da bi olakšale i ubrzale razvoj
aplikacije. Prvi objektno orijentirani frameworci bili su MVC (engl. Model-View-Controller)
za Smalltalk i MacApp za Apple aplikacije. Drugi važni okviri iz ove početne faze bili su
ET++ i Interviews. Zanimljivo je primijetiti da je većina prvobitnih okvira bila kreirana za
projektiranje korisničkog interfejsa. U povijesti frameworka takoĎer je važno spomenuti ime
tvrtke Taligent, zajedničkog pothvata tvrtki Apple, IBM i Hewlett-Packard. Oni su razvili
grupu alata za ubrzan razvoj aplikacija pod nazivom „Zajednička točka“ (engl. Common
Point), koji se sastoji od više od stotinu objektno orijentiranih frameworka.
Okviri su slični softverskim bibliotekama budući da i jedni i drugi predstavljaju kod koji se
može ponovo koristiti upakiran u API (engl. Application Programming Interface). Biblioteke
služe za ponovnu upotrebu koda, ali ne podrazumijevaju neku konkretnu strukturu aplikacije,
već samo omogućuju funkcionalnosti pomoću kojih aplikacija radi. S druge strane,
frameworci predstavljaju apstraktnu specifikaciju nekog tipa aplikacije. Ipak, neke biblioteke
se pomalo ponašaju kao frameworci, a s druge strane ima fremeworka koji se mogu koristiti
2
Dr. Siniša Vlajid: Projektovanje programa (Skripta), FON, Beograd, 2004.
35
kao biblioteke klasa. To se može promatrati kao kontinuum sa tradicionalnim bibliotekama na
jednom i odgovarajućim frameworkom na drugom kraju.
Često se postavlja pitanje ometa li korištenje frameworka kreativnost programera? Na prvi
pogled izgleda tako jer projektiranje softvera i dalje predstavlja spoj nauke i umjetnosti.
MeĎutim, čak i svaki školovani umjetnik koristi metodologiju koja mu omogućuje da usmjeri
svoj kreativni rad u željenom smjeru. Dobro izabrana metodologija zapravo oslobaĎa
umjetnika od brige oko osnova; konkretno programer se može posvetiti dizajniranju boljeg
korisničkog interfejsa (funkcionalno i vizualno), boljim performansama, itd.
Programiranje u frameworku svodi se na graĎenje aplikacije od unaprijed definiranih
programskih instrukcija nad konkretno definiranim podacima i pisanje specifičnih funkcija
ovisnih o zahtjevu koji aplikacija mora zadovoljiti.
5.1.1. Definicije frameworka
Ne postoji jedinstvena definicija frameworka te gotovo svatko tko se bavio ovom granom
softverskog inženjerstva dao je svoju definiciju frameworka. Razornost definicija pokazuje da
zapravo nema slaganja oko toga što je zapravo framework aplikacije. Različite definicije
frameworka:

Framework je biblioteka klasa koja sadrži uzore interakcije izmeĎu objekata. Sastoji
se od konkretnih i apstraktnih klasa, specijalno kreiranih da se koriste zajedno.

Framework je logička struktura koja klasificira i organizira složene informacije.

Framework je skup kolaboracijskih koncepata oblikovanih za jednostavnu ponovnu
upotrebu.

Framework je konkretno, ali nekompletno rješenje za probleme velike važnosti koji se
ponavljaju.

Framework je aplikacija u kojoj se generički kod za standardne funkcionalnosti može
selektivno prekriti korisničkim kodom kojim će se dobiti specifične funkcionalnosti.

Framework je kostur aplikacije, koji sadrži kompletan kod osnovnih funkcija cijelog
sustava, a koji se može prilagoditi za potrebe konkretne aplikacije.

Klasa je za objekt isto ono što je framework za aplikaciju. Klasa je prototip, skica
objekta, isto kao što je framework prototip, odnosno skica aplikacije.

Frameworci su generatori aplikacija odreĎene domene.
36
5.1.2. Struktura frameworka

Omotač (eng. wrapper)
o Pojednostavljuje interfejs k tehnologiji
o Smanjuje/eliminira ponavljajuće zadatke
o Povećava fleksibilnost aplikacije korištenjem apstrakcije
o Često se mogu ponovo koristiti bez obzira na projektantske odluke visokog
nivoa

Arhitektura
o Arhitektura predstavlja način na koji se implementiraju i povezuju komponente
sustava

Metodologija
o Usmjerava projektiranje i čini ga konzistentnim
o Često se može ponovo koristiti bez obzira na zahtjeve aplikacije
5.1.3. Svojstva frameworka
1. Framework je konkretan. Drugim riječima, framework se sastoji od fizičkih
komponenti, koje najčešće čine datoteke, biblioteke i slično. Uzori projektiranja nisu
framework, već korisne ideje koje programer po svojoj procjeni realizira u toku
izvoĎenja projekta. Za razliku od toga framework je jedna moguća realizacija.
2. Framework je nekompletan. To nije gotovo rješenje, već ostavlja programeru
konkretna mjesta koja treba popuniti odgovarajućim kodom. Što je framework
složeniji, to programer manje koda treba napisati, ali je sa druge strane teže naučiti
kako koristiti framework.
3. Framework diktira rješenje. On odreĎuje arhitekturu sustava, dijelove koda koji su
predviĎeni za prilagoĎavanje potrebama konkretne aplikacije, kao i način na koji će se
to uraditi.
4. Framework pomaže u rješavanju problema koji se ponavljaju.
5. Frameworci rješavaju važne probleme. Iako je pojam važnosti relativan, treba imati
na umu da se frameworci prave za rješavanje problema velike važnosti.
37
5.1.4. Prednosti korištenja frameworka

Pojednostavljuje rad sa složenim tehnologijama.

Povezuje pojedinačne komponente/objekte u korisne cjeline.

Kod se implementira konzistentno, čime se obično postiže fleksibilnija aplikacija sa
manje grešaka.

Kod je jednostavniji za održavanje (čak i onima koji ga nisu implementirali).

Frameworci postaju zaista korisni tek kada se učestalo koriste. Sa svakim novim
projektom koji koristi framework, pogrešna učenja postaju sve manji problem, a
produktivnost se povećava.

Funkcionalnost koja treba premostiti ili zaobići nedostatke u frameworcima može
uzrokovati više poteškoća i uzeti više vremena nego što bi bio slučaj kada bi se
odreĎena funkcionalnost razvijala u potpunosti. Kvalitetni frameworci pružaju
fleksibilnu strukturu koja omogućuje programeru modifikacije, nadopune ili ugradnju
nekih novih funkcionalnosti. Ovo ne predstavlja funkcionalni nedostatak frameworka,
već je više nedostatak na nivou različite implementacije tih koncepata.

Programske pogreške (bug-ovi) i sigurnost u frameworku se mogu odraziti na svaku
aplikaciju koja koristi taj framework. Osim toga, svaka aplikacija mora biti posebno
testirana u odnosu na framework i popravljena ukoliko ima sigurnosnih propusta.
Softverski framework predstavlja skup kodova ili biblioteka koji pružaju zajedničku
funkcionalnost za cijelu klasu aplikacija. Za razliku od jedne biblioteke koja obično pruža
jedan specifični dio funkcionalnosti, frameworci pružaju širi opseg funkcionalnosti korištenih
od strane jednog tipa aplikacije.
Umjesto ponovnog pisanja koda za uobičajenu programsku logiku, programer može iskoristiti
framework koji će mu pružiti zahtijevanu funkcionalnost, znatno smanjujući vrijeme potrebno
za kreiranje aplikacije, a istovremeno se smanjuje mogućnost pojavljivanja novih
programerskih grešaka (bug-ova) i sigurnosnih propusta. Na primjer, frameworci web
aplikacija mogu pružiti svu potrebnu funkcionalnost vezanu za upravljanje sesijom korisnika,
skladištenjem podataka i izgledom web stranica. Postoji mnogo različitih tipova frameworka
od kojih neki nude tek nešto malo više od individualnih modula različitih funkcionalnosti i
skupova alata slabo povezanih nekim zajedničkim okvirom aplikacije, dok drugi nude skoro
38
gotovu aplikaciju sa strogo definiranom strukturom i drugim pravilima. Izbor pravog
frameworka za dani projekt često zahtjeva od programera da balansira izmeĎu funkcionalnosti
koju framework nudi i fleksibilnosti koja nakon toga ostaje.
5.2.
Popularni PHP MVC frameworci
Danas postoji veći broj gotovih framework-a za PHP, od koji su najpoznatiji CakePhp,
CodeIgniter, Zend Framework, Symfony, … Njihova usporedba prikazana je na slici 1-1.
Slika 9. Pregled postojećih PHP frameworka
5.2.1. Zend Framework
Zend Framework je razvojno okruženje otvorenog koda za izradu web aplikacija i servisa
zasnovan na programskom jeziku PHP 5. Zend je u potpunosti implementiran korištenjem
objektno orijentirane paradigme. Komponente ovog web razvojnog okruženja oblikovane su
tako da imaju što manji broj zavisnosti prema drugim komponentama.
39
Ovim se postiže suglasnost sa jednim od osnovnih koncepata objektno orijentiranog
programiranja, a to je smanjivanje sprege (engl. coupling). Slaba spregnutost komponenata
omogućuje programerima korištenje individualnih komponenata po potrebi. Zend zajednica
ovu pogodnost naziva oblikovanje po potrebi (engl. use-at-will design).
Iako ih je moguće koristiti odvojeno, komponente razvojnog okruženja Zend čine snažnu i
proširivu biblioteku gotovih rješenja. Cilj Zenda je pružiti programerima robusnu okolinu za
razvoj vlastitih web aplikacija i usluga. On nudi MVC implementaciju visoke učinkovitosti,
apstraktni sloj nad bazom podataka koji olakšava upravljanje nad podacima i niz
komponenata koje implementiraju prikaz HTML stranica te validaciju i filtriranje korisničkog
unosa. Ostale komponente kao što su Zend_Auth i Zend_Acl omogućavaju autorizaciju i
autentifikaciju korisnika prilikom pristupa resursu. Prednost razvojnog okruženja Zend
Framework je velika količina gotovih komponenata koje se mogu iskoristiti za izradu vlastitih
web aplikacija ili servisa, a te komponente su temeljito testirane i isprobane.
Korištenjem gotovih testiranih komponenata smanjuje se vrijeme razvoja. Na primjer,
validacija i/ili filtriranje korisničkog unosa česta je operacija u svim web aplikacijama.
Ovisno o domeni aplikacije, korisnički unos ponekad može biti problematičan za analizu (npr.
unos e-mail adrese). Zend sadrži niz gotovih komponenata koje implementiraju većinu
poslovne logike vezane za filtriranje i validaciju unosa.
Glavni sponzor projekta „Zend Framework“ je tvrtka Zend Technologies, ali i mnoge tvrtke
su pridonijele razvoju ovog web razvojnog okruženja. Ovakva potpora privatnog sektora
omogućava brži razvoj i kvalitetniju potporu. Dodatno, osnivači tvrtke Zend Technologies su
Andi Gutmas i Zeev Suraski, koji se poznati kroz svoj rad na jezgri programskog jezika PHP.
Smatra se da je njihova popularnost imala značajan utjecaj na širenje i prihvaćanje Zend
okruženja u ranim fazama njegova razvoja. Tvrtke kao što su Google, Microsoft i Strikelron
udružile su se sa Zend Technologies kako bi pružili gotove komponente, odnosno sučelja
prema vlastitim servisima i drugim tehnologijama koje žele pružiti korisnicima razvojnog
okruženja Zend. Osim službenih partnera, Zend Framework se sastoji od velike zajednice
korisnika koji meĎusobno razmjenjuju informacije putem IRC kanala, foruma i elektroničke
pošte.
Razvoj Zenda usko je vezan za razvoj programskog jezika PHP. Točnije, nastao je u cilju
proširivanja jezika i poboljšanja učinkovitosti u izradi aplikacija.
40
Nakon što je PHP 3.0 postao javno dostupan 1998. godine, Andi Gutmas i Zeev Suraski
počeli su raditi na poboljšanju njegove jezgre. Cilj im je bio poboljšati performanse složenih
aplikacija i podršku za modularnu izradu komponenata. Tadašnja treća inačica Zend
okruženja nije bila u stanju učinkovito raditi sa složenim tipovima podataka. Svoje
poboljšanje prozvali su Zend Engine. Prvi puta je predstavljena 1999. godine, a nova, četvrta
inačica programskog jezika PHP bazirala se na Zend Engineu. Nova inačica je donijela brojne
pogodnosti kao što su:

podrška za više poslužitelja

visoke performanse

HTTP sjednice

globalne poslužiteljske varijable (npr. $_GET, $_POST, $_COOKIE, $_SESSION)

sigurniji način upravljanja korisničkim unosom
PHP 4 i dalje nije bio bolji po pitanju objektnog modeliranja od inačice 3. Iako PHP nije bio
stvoren za objektno orijentirano modeliranje mnogi programeri su ga ipak koristili. Nova
inačica Zend razvojnog okruženja (Zend 2) sadrži većinu obilježja objektno orijentiranih
jezika kao što su:

prosljeĎivanje referenci (engl. Pass by Reference)

kopiranje objekata (poznatije kao kloniranje)

vraćanje objekata
PHP inačica 5 je po uzoru na Zend 2 preuzela sve karakteristike objektne paradigme te se od
inačice 5 programski jezik PHP satra potpuno objektno orijentiranim jezikom. Neke nove
karakteristike, uz one koje uvodi Zend 2, su:

destruktori

sakupljači smeća3

vidljivost varijabli objekata (standardno: public, private, protected)
usvajanjem objektne paradigme stvorilo se plodno tlo za daljnji razvoj biblioteka gotovih
funkcionalnih modula (engl. Framework). Gotove komponente bile bi oblikovane po
odgovarajućim oblikovnim obrascima što smanjuje meĎusobnu povezanost i time povećava
3
Sakupljači smeda – (engl. Garbage Collection) u računalnoj znanosti predstavlja oblik automatiziranog
upravljanja memorije. Karakteristični su za jezike poput Java, C#, Python i drugi, a primarna zadada je brisanje
objekata iz memorije koji se više ne koriste.
41
modularnost. Ta inicijativa s vremenom je sazrela u Zend Framework. Suraski smatra da će
kroz nekoliko narednih godina trend razvoja aplikacija korištenjem jezika PHP naglo narasti,
a primarni razlog će biti korištenje razvojnih okruženja poput Zenda. Budućnost razvoja
samog razvojnog okruženja Zend bit će usmjerena na računarstvu zasnovanom na oblacima.
Slika 10. Zend framework
5.2.2. CakePHP Framework
CakePHP je web razvojno okruženje otvorenog koda izraĎeno u programskom jeziku PHP
koje pruža proširivu arhitekturu za razvoj, održavanje i implementaciju programa. Razvoj
Cake-a počinje u travnju 2005. godine. Inspiriran programom Ruby on Rails, Michal
Tatarynowicz objavio ga je pod MIT licencom i omogućio da ga koriste zajednice
programera. U srpnju 2005. godine, Larry E. Masters (poznatiji kao PhpNut) preuzeo je ulogu
glavnog programera ovog frameworka. Od tada je nastalo nekoliko projekata i još uvijek se
radi na razvoju novih. Dobro je dokumentiran framework, a oblikovan je pomoću koncepata
Ruby on Rails razvojnog okruženja, koji može biti primijenjen u PHP4 i PHP5. Iako koristi
mnoge koncepte Rails okruženja, ne radi se o pokušaju prevoĎenja tog jezika u PHP
programski jezik. CakePHP se koristi za razvoj raznolikih aplikacija, a popis nekih stranica
koje su izgraĎene pomoću CakePHP-a može se pronaći na službenim stranicama ili u literaturi
[6]. Cake olakšava komunikaciju user interface-a sa bazom podataka, brz je, koristi MVC
arhitekturu te time forsira objektno orijentirano programiranje.
Neke osobine CakePHP-a:

Kompatibilan je sa PHP4 i PHP5

Fleksibilan View Cashing

Application Scaffolding

Access Control List
42

View Helpers za AJAX, Javascript, HTML forme, …

Radi iz bilo kojeg website poddirektorija

Brz, fleksibilan template (PHP sintaksa sa Helper metodama)

UgraĎena validacija

Website directory nezavisan

View caching
U odnosu na Zend, CakePHP jednostavniji je za korištenje, pogotovo kod početnika. Iako oba
okruženja nude veliku razinu modularnosti i uporabu gotovih komponenata, CakePHP većinu
postavki i operacija definira i obraĎuje samostalno, dok Zend zahtjeva dublje poznavanje
korištene komponente. Iz tog razloga pogodniji je za manje projekte gdje se u relativno
malom vremenskom razdoblju mora razraditi funkcionalan prototip. Izrada istog projekta
korištenjem Zend okruženja mogla bi trajati dulje ukoliko se odabrane komponente moraju
dodatno konfigurirati ili preoblikovati. CakePHP zahtjeva znatno manje poznavanje
objektnog programiranja budući da nije nužno ručno konfigurirati gotove komponente.
Nedostatak okruženja CakePHP je manja fleksibilnost u odnosu na Zend. Zbog unaprijed
pretpostavljenog ponašanja komponenti teško je unositi veće promijene bez mijenjanja samog
izvornog koda komponente. Komponente Zend okruženja mogu promiijeniti svoje ponašanje
jednostavnom manipulacijom postavki putem definiranog sučelja što ih čini vrlo fleksibilnim.
Iz tog se razloga Zend okruženje koristi u većim projektima gdje se promijene zahtijeva
dogaĎaju često.
Slika 11. CakePHP framework
43
5.2.3. CodeIgniter Framework
CodeIgniter je brzo, besplatno, objektno orijentirano web razvojno okruženje otvorenog koda
pisano u programskom jeziku PHP. Cilj okruženja je omogućiti programerima razvoj složenih
aplikacija korištenjem bogatih biblioteka gotovih funkcija. Sama konfiguracija dosta je
jednostavna te nije potrebna baza za svaki kontroler, kao što je to primjer u CakePHP-u.
Prva inačica okruženja CodeIgniter izdana je 28.02.2006. godine i od tada do danas je prešao
veliki put i razvio se u jedan od najboljih PHP frameworka. Trenutna stabilna inačica je 2.0.
Okvirno se bazira na MVC obrascu. U ovom obrascu, na kojem je zasnovana većina
frameworka, model služi za bilo kakvu komunikaciju s bazom podataka, view služi za prikaz
podataka, a u kontroleru se nalazi sva programska logika, te kontroler povezuje podatke iz
modela i prikazuje ih u viewu. Točnije, kontroleri i pogledi su nužni dio okruženja, ali model
nije i rijetko se koristi.
Ovo razvojno okruženje ističe se brojnim svojim performansama. Podrazumijeva rad po
odreĎenom standardu koji omogućuje jednostavan rad i lako održavanje. TakoĎer se
jednostavnije snaći u kodu koji je pisao netko drugi bez većih poteškoća, kao i bržu adaptaciju
onoga tko ne sudjeluje u izradi projekta od samog početka. Omogućava i ponovno korištenje
koda, što znači da ukoliko je jednom napravljena, na primjer, login forma ona se može
koristiti uz minimalne izmjene i u daljnjem radu. Najbrži je od prethodno spomenutih
okruženja. CodeIgniter ne zahtjeva korištenje naredbenog retka (konzole) kao većina
frameworka što pridonosi jednostavnosti korištenja. TakoĎer pruža svu slobodu u kodiranju i
imenovanju funkcija u čemu nema nekih ograničenja.
Jedan od tvoraca programskog jezika PHP, Rasmus Ledford, na konferenciji frOSCon 2008.
godine pohvalio je CodeIgniter okruženje zbog visokih performansi, velike zajednice
korisnika i jednostavnosti korištenja.
Instalacija CodeIgnitera je jednostavna i lako se konfigurira. Pogodan je za izradu većih
aplikacija te omogućava povezivanje sa velikim brojem tipova baza (MySQL, MySQLi, MS
SQL, Oracle, SQLite, ODBC) kao i povezivanje sa više baza podataka unutar jedne
aplikacije.
44
Ipak, postoje odreĎene mane ovog okruženja, kao što su:

podrška za predloške (engl. templates)

korisničke kontrole

integracija sa programskim jezikom jQuery

kompatibilnost sa PHP inačicom 4
Zadnja stavka (kompatibilnost sa PHP 4) se broji kao mana iz razloga što se u program
uključuje velika količina nepotrebnog koda što smanjuje preglednost i održavanje.
Slika 12. CodeIgniter framework
5.2.4. Yii framework
Yiiframework je web razvojno okruženje otvorenog koda izraĎeno u programskom jeziku
PHP. Yii je akronim za „Yes It Is!“. Yii projekt započet je početkom 2008. godine u cilju
poboljšanja PRADO4 web razvojnog okruženja. Nedostatak PRADO okruženja je bio spor
odaziv prilikom prevoĎenja složenih stranica weba, te nije bio pogodan za početnike i mnoge
komponente za obavljanje raznih funkcija kao što su pristup bazi podataka i obavljanje upita,
validacija korisničkog unosa, automatizirano generiranje kompleksnih WSDL specifikacija za
servise, pretpohranjivanje (engl. caching) sadržaja i drugo. Ujedno je i jedino razvojno
okruženje za programski jezik PHP koji nalikuje okruženju ASP.NET. Ipak, nije primarni
izbor za početnike, ali niti za veće projekte. Razlog tomu je manjak funkcionalnosti u odnosu
na okruženja poput CakePHP, CodeIgniter i Zend.
4
PRADO – web razvojno okruženje temeljeno je na događajima i komponentama. PRADO uvodi nove koncepte
u razvoj web aplikacija kao što su događaji i svojstva. Ovi novi koncepti zamjenjuju postojede koncepte
procedura, URL-a i parametara u upitima koji se javljaju u ostalim okruženjima.
45
Dodatno, Yii je relativno mlado razvojno okruženje. U vrijeme pisanja nalazi se u inačici 1.0.,
što je apriorni nedostatak zbog mogućih neuočenih grešaka i znatno manje zajednice
korisnika u odnosu na ostala okruženja.
Slika 13. Yii framework
5.2.5. Symfony framework
Symfony Framework je PHP framework otvorenog koda (open source) za web aplikacije.
Agencija Sensi Labs stvorila je ovaj framework za potrebe vlastitih web stranica. Symfony je
izdan 2005. godine pod MIT Open Source licencom te je danas jedan od vodećih frameworka
za PHP razvoj web sadržaja.
Odlikuje se bogatstvom sadržaja, podrškom velike zajednice, profesionalnom podrškom itd.
Brojne stranice su izgraĎene upravo korištenjem Symfony frameworka – Yahoo!,
Daillymotion, Opensky.com, Exercise.com pa čak i phpBB.
Korištenje nekog frameworka može biti jako dobar izbor zbog više činjenica. U tekstu ispod
navedene su prednosti zašto je dobro koristiti baš ovaj framework umjesto nekog drugog
frameworka:

Ugled – već nakon pokretanja projekta Symfony 2005. godine, profesionalci u
području razvoja web usluga su ga prihvatili zbog lako prepoznatljivog i stabilnog
okruženja. Zahvaljujući svojoj aktivnoj zajednici i razvojnim inženjerima, Symfony se
kontinuirano razvija.

Trajnost – tvrtka koja je razvila Symfony, Sensio, nastala je prije više od 12 godina.
Ta ista tvrtka danas vakodnevno koristi Symfony framework za vlastite projekte.
46
Dizajniran od strane profesionalca, i za profesionalce, Symfony je prije svega
pragmatičan alat sa odličnim mogućnostima za primjenu u realnoj okolini. Sensio i
danas pruža podršku za ovaj framework, ali je možda još važnija podrška rastuće
zajednice i mnogih kompanija koje su uložile u razvoj frameworka.

Preporuke – brojni profesionalci i tvrtke preporučuju upravo ovaj framework. Veliki
broj stranica i aplikacija je odabralo Symfony.

Inovacije – Symfony ima najbolje karakteristike frameworka: brzina, fleksibilnost,
ponovno upotrebljive komponente itd. Nastoji prilagoditi inovacije i ideje svijetu
PHP-a. takoĎer treba spomenuti i konstantna poboljšanja koja dovode do povećane
produktivnosti razvojnih inženjera.

Resursi – bogatstvo resursa je odlika Symfony frameworka. Od podrške koju pruža
Sensio do podrške zajednice uvijek je moguće pronaći odgovore na postavljena
pitanja. Vodeći se principom „nedokumentirana linija je linija koja ne postoji“ mogu
se pronaći brojna djela posvećena upravo Symfony frameworku koja pomažu razvoju
stranica i aplikacija.

Interoperabilnost – Symfony podržava trenutne standarde PHP-a: PHPUnit,
konvencije nazivanja klasa itd. TakoĎer omogućuje korisniku korištenje dijelova
vlastitog softvera bez korištenja cijelog frameworka. Toliko je interoperabilan da i
sam koristi dijelove vanjskog softvera (ORM Doctrine, Swiftmailer i slično).
Slika 14. Symfony framework
47
6. Primjer web aplikacije
6.1. Struktura PHP web aplikacije izgrađene pomoću CodeIgniter-a
CodeIgniter je jedan od najpopularnijih PHP frameworka zasnovanih na MVC arhitekturi. U
najvećoj mjeri svoju popularnost duguje jednostavnosti i maloj liniji učenja, ali je privlačan i
zbog činjenice da sa njegovom instalacijom programer dobiva mnogo definiranih obrazaca i
na njemu je samo da odluči koje će koristiti i kako. On korisniku nudi predefinirane obrasce
za Model, View i Controller, koji su definirani kao klase (sa prefiksom CI kao CodeIgniter, tj.
CI_Model itd. ) koje programer treba naslijediti i zatim sa lakoćom implementirati. Osim njih,
CodeIgniter programeru definira i znatan broj drugih rješenja, kao pristupe bazi, te autoloader
klasa i funkcija koje su potrebne širom aplikacije. CodeIgniter dolazi sa predefiniranom
strukturom, koju programer može modificirati po svojim željama. U toj strukturi, ističu se
direktoriji controllers, models i views, gdje su u aplikaciji iz primjera smještene MVC
komponente.
Slika 15. Direktorij MVC PHP aplikacije
Analizom prethodno napisane PHP web aplikacije, koja nije koristila MVC pristup, donesen
je zaključak da je riječ o aplikaciji kojoj je potreban jedan kontroler.
48
Stoga je u controllers direktoriju dodana skripta site.php i u njoj definirana klasa Site, koja
nasljeĎuje CodeIgniter-ovu definiranu klasu za kontroler, CI_Controller.
site.php
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');
class Site extends CI_Controller {
public function index()
{
$this->load->view('html_head');
$this->load->view('header');
$this->load->view('menu');
$this->load->view('pocetna');
$this->load->view('footer');
}
* * *
public function apartmani_objekti($action = false, $param = false)
{
$this->load->model('Apartmani_objekti_model');
if(isset($action)) {
switch ($action) {
case 'delete':
$name = $this->Apartmani_objekti_model->getObjektName($param);
$this->Apartmani_objekti_model->delete($param);
$data['deleted'] = $name;
break;
case 'addedit':
if(isset($param)){
$data['obj'] = $this->Apartmani_objekti_model->get($param);
}
$this->load->model('Mjesta_model');
$data['mjesta'] = $this->Mjesta_model->getAll();
$this->load->view('html_head');
$this->load->view('header');
$this->load->view('menu');
$this->load->view('add_edit_apartman', $data);
$this->load->view('footer');
break;
case 'insert':
if( $this->Apartmani_objekti_model->insert($_POST) ){
$this->load->view('apartman_dodan', $_POST);
} else {
echo "Nije uspjelo.Pokusajte opet";
}
break;
case 'update':
if( $this->Apartmani_objekti_model->update($_POST) ){
$this->load->view('apartman_updatean', $_POST);
} else {
echo "Nije uspjelo.Pokusajte opet";
}
break;
default:
# code...
break;
}
}
49
if( $action != 'addedit' && $action != 'insert' && $action != 'update'){
$data['objects'] = $this->Apartmani_objekti_model->getAllObjects();
//echo json_encode($data);
$this->load->view('html_head');
$this->load->view('header');
$this->load->view('menu');
$this->load->view('apartmani_objekti', $data);
$this->load->view('footer');
}
}
}
Codeigniterov kontroler treba posjedovati metodu index, koja je početna metoda koju
kontroler izvodi. Ostale metode se pozivaju iz url-a. Naime, CodeIgniter interpretira url na
sljedeći način:
www.primjer.com/kontroler/metoda/parametar1/parametar2
Dakle, CodeIgniter iz url-a zaključuje koji kontroler trenutno upravlja aplikacijom. Pri tome,
zahtjeva da se jedan kontroler postavi kao početni, što je u ovom slučaju Site. Ukoliko metoda
nije specificirana, pozvati će se index metoda. U suprotnom, potrebno je u url-u navesti
metodu. Za poziv metode apartmani_objekti, potrebno je pozvati
www.primjer.com/site/apartmani_objekti
Ovako pozvana metoda će, kao što se može vidjeti u kodu, pozvati Apartmani_objekti_model.
Model je definiran tako, da služi isključivo za dohvat i manipulaciju podataka iz baze
podataka:
apartmani_objekti_model.php
<?php
class Apartmani_objekti_model extends CI_Model {
function __construct()
{
parent::__construct();
}
function getAllObjects()
{
$this->db->select('*');
$this->db->from('apartmani_objekti');
$this->db->join('mjesto', 'mjesto.ID_mjesto =
apartmani_objekti.ID_mjesto');
//$query = $this->db->get();
return $this->db->get()->result();
}
function delete($id)
{
50
$this->load->model('Apartmani_smjestaj_model');
$this->Apartmani_smjestaj_model->deleteByObject($id);
$this->db->where('ID_objekta', $id);
$this->db->delete('apartmani_objekti');
}
function get($id)
{
$this->db->where('ID_objekta', $id);
$this->db->from('apartmani_objekti');
return $this->db->get()->row();
}
function getObjektName($id)
{
$this->db->select('naziv_objekta');
$this->db->where('ID_objekta', $id);
$this->db->from('apartmani_objekti');
return $this->db->get()->row();
}
function insert($data)
{
unset($data['posalji']);
$this->db->insert('apartmani_objekti', $data);
return true;
}
function update($data)
{
unset($data['posalji']);
$this->db->where('ID_objekta', $data['ID_objekta']);
$this->db->update('apartmani_objekti', $data);
return true;
}
}
Ovaj model sadrži sve osnovne CRUD metode (CReate, Update, Delete – stvori, izmjeni,
pobriši) kao i metodu za ispis svih apartmana. Upravo metoda za ispis (getAllObjects) se
poziva pri pozivu apartmani_objekti metode kontrolera. U toj metodi, kao i unutar ostalih
funkcija, može se vidjeti još jedna osobina CodeIgnitera, a to je način pisanja SQL upita.
CodeIgniter ima svoj objekt za manipuliranje bazom podataka, te se u većini slučajeva ne
mora pisati sam upit, već se preko tog objekta može framework-u prepustiti formiranje upita
preko njegovih pravila.
U slučaju da se kontrolerovoj funkciji apartmani_objekti u url-u pridruži još parametara, ta
funkcija će pristupiti nekoj drugoj metodi modela. Kao što se može vidjeti u kodu,
apartmani_objekti metoda kontrolera očekuje 2 parametra: action i param. Prvi parametar
odreĎuje koja će se metoda modela pozvati, a druga koji parametar će se slati toj metodi.
51
Primjerice, ukoliko se pošalje url:
www.primjer.com/site/apartmani_objekti/delete/1
pozvati će se model Apartmani_objekti, i njegova metoda delete, koja očekuje parametar koji
tumači kao id zapisa u bazi apartmana kojeg želimo pobrisati. TakoĎer, i upit za brisanje iz
baze, može se izvršiti preko CodeIgniter-ovog db objekta. Problem nastaje, jer se u drugim
tablicama u bazi, nalazi id našega apartmana. U tom slučaju, CodeIgniter-ov db objekt neće
htjeti izvršiti akciju brisanja. Za razliku od nekih drugih frameworka, CodeIgniter nije
dovoljno „pametan“ da sam pobriše zavisne zapise u bazi. Zbog toga, prije nego se pristupi
akciji brisanja, model Apartmani_objeti poziva model Apartmani_smjestaj, te mu govori da
pobriše sve zapise, gdje je strani ključ apartmani_id jednak id-u kojeg želimo pobrisati. Taj
model takoĎer, ukoliko postoje, poziva zavisne modele da pobrišu podatke koji više nisu
relevantni.
apartmani_smjestaj_model.php
<?php
class Apartmani_smjestaj_model extends CI_Model {
function __construct()
{
parent::__construct();
}
function delete($id)
{
$this->db->where('ID_smjestaj', $id);
$this->db->delete('apartmani_smjestaj');
}
function deleteByObject($id_object)
{
$this->db->select('ID_smjestaj');
$this->db->from('apartmani_smjestaj');
$smjestajs = $this->db->get()->result();
//echo $smjestajs;
$this->load->model('Slike_model');
$this->load->model('Rezervacija_model');
foreach ($smjestajs as $smjestaj) {
$this->Slike_model->deleteBySmjestaj($smjestaj->ID_smjestaj);
$this->Rezervacija_model->deleteBySmjestaj($smjestaj->ID_smjestaj);
$this->delete($smjestaj->ID_smjestaj);
}
}
}
mjesta_model.php
<?php
class Mjesta_model extends CI_Model {
function __construct()
{
52
parent::__construct();
}
function getAll()
{
$this->db->select('*');
$this->db->from('mjesto');
//$query = $this->db->get();
return $this->db->get()->result();
}
}
rezervacija_model.php
<?php
class Rezervacija_model extends CI_Model {
function __construct()
{
parent::__construct();
}
function deleteBySmjestaj($ID_smjestaj)
{
$this->db->where('ID_smjestaj', $ID_smjestaj);
$this->db->delete('rezervacija');
}
}
slike_model.php
<?php
class Slike_model extends CI_Model {
function __construct()
{
parent::__construct();
}
function deleteBySmjestaj($ID_smjestaj)
{
$this->db->where('ID_smjestaj', $ID_smjestaj);
$this->db->delete('slike');
}
}
Prilikom izvršavanja metode brisanja, kontroler je uzeo podatke o apartmanu koji je pobrisao
i spremio ih u objekt $data. Kontroler, nakon što je model izvršio manipulacije nad bazom,
poziva View komponente sustava. U ovim datotekama bi, po pravilu, trebao biti definiran
samo prikaz naše stranice, uz što manje logike, koja bi trebala biti svedena na provjeru
podataka koji su tom pogledu proslijeĎeni. Pogled se poziva korištenjem load→view funkcije,
koja kao parametar prima naziv php datoteke koja se nalazi u views direktoriju, te opcionalno
parametara koje je model dohvatio i obradio. Pri tome, kontroler može dohvatiti više pogleda,
a na programeru koji se brine o toj komponenti je da se pobrine da se svi pogledi učitaju
ispravno.
53
View : apartmani_objekti
<?php
echo '<div id="pregled_apartmana" >';
echo "<h2>Pregled apartmana</h2>";
if(isset($deleted)){
echo '<p>Pobrisan je objekt '. $deleted->naziv_objekta .'</p>';
}
?>
<table class=\"sample\">
<tr><th>&nbsp ŠIFRA &nbsp </th>
<th>&nbsp &nbsp NAZIV &nbsp &nbsp </th>
<th>&nbsp VLASNIK &nbsp </th>
<th>&nbsp &nbsp ADRESA &nbsp &nbsp </th>
<th> &nbsp MJESTO &nbsp </th>
<th></th><th></th>
</tr>
foreach($objects as $obj) {
echo "<tr>";
echo "<td>".$obj->ID_objekta."</td>";
echo "<td>".$obj->naziv_objekta."</td>";
echo "<td>".$obj->vlasnik."</td>";
echo "<td>".$obj->adresa."</td>";
echo "<td>".$obj->naziv_mjesto."</td>";
echo "<td><a
href=".base_url()."index.php/site/apartmani_objekti/delete/".$obj->ID_objekta."
\"onclick=\"return confirm('Želite li stvarno pobrisati');\">Briši </a></td>";
echo "<td><a
href='".base_url()."index.php/site/apartmani_objekti/addedit/".$obj>ID_objekta."'>A&#382;uriraj</a></td>";
echo "</tr>";
}
echo "</table>";
echo "</br></br></br><a
href='".base_url()."index.php/site/apartmani_objekti/addedit'>Dodaj novi
objekt</a>";
echo '</div>';
Na vrlo sličan način pozivaju se i metode za dodavanje i izmjenu postojećeg apartmana. Ove
metode, zbog svoje specifičnosti, pozivaju drugi pogled, onaj sa formom za unos / izmjenu
postojećih podataka. Budući da je forma koju treba ispuniti praktički ista, a zahvaljujući
činjenici da se u CodeIgniteru pogledu mogu pridružiti i podaci, moguće je koristiti isti
pogled, uz upotrebu malo logike ( provjera postoje li podaci ).
TakoĎer, u ovisnosti o tome jesu li primljeni podaci o ureĎivanom objektu, forma će imati
drugu akciju po završetku.
54
View: add_edit_apartman.php
<?php
if(!empty($obj)){
$action = '../update';
$selected_mjesto = $obj->ID_mjesto;
$naslov = 'UREDIVANJE APARTMANA '.$obj->naziv_objekta;
$button_label = 'UREDI';
} else {
$action = 'insert';
$selected_mjesto = 0;
$naslov = 'DODAVANJE NOVOG OBJEKTA APARTMANA';
$button_label = 'DODAJ';
}
?>
<div >
<div >
<div >
<div id="dodavanje_apartmana" > </br></br></br>
<h1> <?php echo $naslov;?></h1>
</div>
<div class="container">
<form action="<?php echo $action; ?>" method="POST" class="dodaj">
<?php
if(!empty($obj)){
echo '<input type="hidden" name="ID_objekta" value = '.$obj>ID_objekta.'>';
}
?>
<span>NAZIV OBJEKTA: </br>
<input type="text" name="naziv_objekta" value="<?php
if(!empty($obj)) { echo $obj->naziv_objekta;}?>">
<span><br>
<span>VLASNIK: </br>
<input type="text" name="vlasnik" value="<?php
if(!empty($obj)) { echo $obj->vlasnik;}?>">
<span><br>
<span>ADRESA: </br>
<input type="text" name="adresa" value="<?php if(!empty($obj))
{ echo $obj->adresa;}?>">
<span><br>
<span>TELEFON: </br>
<input type="text" name="telefon" value="<?php if(!empty($obj)) {
echo $obj->telefon;}?>">
<span><br>
* * *
<span> MJESTO: </br>
<select name="ID_mjesto">
<option value="odabir" value="<?php if(!empty($obj)) { echo $obj>ID_mjesto;}?>"> Odaberite mjesto </option> </br></br></br>
<?php
foreach ($mjesta as $mjesto) {
echo "<option value='".$mjesto->ID_mjesto."' ".($mjesto->ID_mjesto ==
$selected_mjesto ? 'selected' : '') .">". $mjesto->naziv_mjesto.
"</br></br></option></br></br></br>";
}
?>
</select>
<span>
55
</br></br><input type="submit" name="posalji" value="<?php
echo $button_label; ?>"><br>
</form>
</div></div></div></div>
Iz ovog kratkog primjera, može se vidjeti logička podjela komponenti u aplikaciji. Dok se u
klasičnoj PHP web aplikaciji, unutar jedne skripte mogu naći mnoge komponente, kao što su
markup (HTML), SQL upiti, obrada podataka, pozivanje drugih skripti i slično, u
prezentiranoj aplikaciji toga nema.
Podjela je jasno učinjena: kontroler se prvi poziva, te mu je zadatak da na osnovu poziva koji
je korisnik napravio odluči što treba učiniti, te koje modele i poglede pozvati. Modelu
nareĎuje da mu dohvati potrebne podatke, i po potrebi ih izmjeni kao i da manipulira bazom
podataka. To je jedini zadatak koji model treba imati, te se isti, kao ni kontroler, uopće ne
treba brinuti kako će se podaci prikazati. To je zadaća pogleda, kojeg nakon dohvata podataka
poziva kontroler.
56
7. Zaključak
Razvojem objektno orijentiranog programiranja javlja se potreba za razdvajanjem dizajniranja
sučelja od ostalih dijelova sustava.
Jedan od takvih sučelja je MVC (Model-View-Controller) obrazac softverske arhitekture koji
dijeli aplikaciju na tri osnovne komponente: model, pogled i kontroler. MVC specificira gdje
će biti smješten odreĎeni dio aplikacijske logike. Osnovna prednost MVC arhitekture je
razdvajanje projekta na smislene i odvojene cjeline, što predstavlja veliku prednost pri izradi
velikih projekata na kojima radi više osoba. Iz toga proizlazi i druga prednost koja se odnosi
na izmjenu, nadogradnju i budući razvoj. Ovakav pristup omogućava laganu izmjenu jednog
od elemenata bez velike intervencije u druge elemente, kao i ponovo korištenje već
napravljenih elemenata.
Mnoga razvojna okruženja prate arhitektonski obrazac MVC (engl. Model-View-Controller)
koji omogućuje razdvajanje modela podataka s poslovnom pravilima od korisničkog sučelja.
Ovo svojstvo se općenito smatra dobrom praksom obzirom da modularizira kod, potiče
ponovnu uporabu koda i omogućuje više sučelja koji se mogu primjenjivati. Razvojna
okruženja stvorena su s ciljem jednostavnijeg stvaranja i održavanja velikih web aplikacija
zasnovanih na PHP programskom jeziku. Sadrže bogat skup gotovih komponenti koje
pokrivaju velik dio učestalih potreba prilikom izrade web aplikacija.
Posljednjih godina PHP je zahvatila struja kojom se taj skriptni programski jezik podigao na
jednu višu, profesionalniju razinu. Radi se o PHP paketima (php framework) koji služe kao
alati za brži i sigurniji razvoj Internet aplikacija. Njihova namjena je prvenstveno bila da se
gotovi alati iz jedne tehnologije sastave u jedan praktični okvir pa da se tako nastali paket
koristi kao jedan kompletan alat. Tako bi programer bez razmišljanja imao na raspolaganju
osnovne funkcionalnosti tehnologije koju koristi i posvetio se samo logici aplikacije koju
gradi, problemima organizacije datoteka, klasifikacije objekata i slično.
Za praktični dio ovog rada odabran je CodeIgniter framework koji je pogodan je za izradu
većih aplikacija te omogućava povezivanje sa velikim brojem tipova baza, kao i povezivanje
sa više baza podataka unutar jedne aplikacije. To je web razvojno okruženje koje se odlikuje
visokim performansama, velikom zajednicom korisnika te jednostavnosti korištenja.
57
Cilj rada bio je pokazati prednosti korištenja ovakve tehnologije pri razvoju web aplikacije u
odnosu na arhitekturu koju sam koristila pri izradi projekta prošle akademske godine, a
primjeri skripti iz tog projekta navedeni su u četvrtom poglavlju ovog rada, što je i pokazano.
58
8. Literatura
[1]
Deacon, J.; (2013.); Model-View-Controller Arhitecture;
<http://www.jdl.co.uk/briefings/MVC.pdf>; [04.04.2014.]
[2]
Feifan, Zhou; (2011.); Design Patterns: Model-View-Controller;
<http://cupsofcocoa.com/2011/08/13/design-patterns-model-view-controller/>;
[05.04.2014.]
[3]
Cake Software Foundation; (2012.); CakePHP: CakePHP Cookbook Documentation,
<http://book.cakephp.org/2.0/_downloads/en/CakePHPCookbook.pdf >; [01.08.2014.]
[4]
Bari, Ahnsanul i Syam, Anupom; (2007.); CakePHP: Application Development; Packt
Publishing; <http://www.it-ebooks.info/read/2489/>; [11.06.2014.]
[5]
Upton, David; (2007.); CodeIgniter for Rapid PHP Application Development; Packt
Publishing; < http://www.it-ebooks.info/read/2760/>; [14.04.2014]
[6]
Makarov, Alexander; (2013.); Yii Application Development Cookbook; 2nd Edition;
<http://it-ebooks.info/book/2867/>; [14.04.2014.]
[7]
CakePHP tutorijali; dostupno na Internet adresi: <http://www.lynda.com/CakePHPtutorials/Comparing-Zend-Symfony-CakePHP-CodeIgniter/92562/99630-4.html>;
[01.06.2014.]
[8]
Upute za korištenje PHP jezika; dostupno na Internet adresi: <http://www.php.net >
[04.05.2014.]
[9]
[10]
Pitt, C.; (2012.); Pro PHP MVC; Apress
CodeIgniter tutorijali; dostupno na Internet adresi: < http://www.lynda.com/CakePHPtutorials/MVC-Frameworks-Building-PHP-Web-Applications/92562-2.html>;
[05.04.2014.]
[11]
Krasner, Glenn E. i Pope, Stephen T.; (1968.); A Cookbook for Using the Model-ViewController User Interface Paradigmi n Smalltalk-80; JOOP
[12]
Model-View-Controller
(MVC)
Architecture;
dostupno
na
Internet
adresi:
<http://www.jdl.co.uk/briefings/mvc.html>; [12.06.2014.]
[13]
The MVC pattern in theory and practice, dostupno na Internet adresi:
<http://warp.povusers.org/programming/mvc.html>; [12.06.2014.]
[14]
Gamma, E., Helm, R., Johnson, R., Vlissides, J.; (1994.); Design Patterns: Elements
of Reusable Object-Oriented Software
59
Dodatak A: Popis slika
Slika 1. Dijagram razreda MVC uzorka – konceptualni pogled.............................................................. 8
Slika 2. Relacijski model podataka ......................................................................................................... 9
Slika 3. MVC obrazac ........................................................................................................................... 12
Slika 4. MVC arhitektura za web .......................................................................................................... 13
Slika 5. Konceptualni pogled: Dijagram razreda aktivnog modela MVC uzorka ................................. 15
Slika 6. PHP: Hypertext Pretprocessor .................................................................................................. 16
Slika 7. Primjer jednostavne PHP skripte.............................................................................................. 19
Slika 8. Direktorij PHP web aplikacije.................................................................................................. 27
Slika 9. Pregled postojećih PHP frameworka........................................................................................ 39
Slika 10. Zend framework ..................................................................................................................... 42
Slika 11. CakePHP framework .............................................................................................................. 43
Slika 12. CodeIgniter framework .......................................................................................................... 45
Slika 13. Yii framework ........................................................................................................................ 46
Slika 14. Symfony framework............................................................................................................... 47
Slika 15. Direktorij MVC PHP aplikacije ............................................................................................. 48
60
Dodatak B: Popis oznaka i kratica
MVC
(eng. Model-View-Controller)
ASP
(eng. Active Server Pages)
HTTP
(eng. Hypertext Transfer Protocol)
HTML
(eng. Hypertext Markup Language)
SQL
(eng. Structured Query Language)
URL
(eng. Uniform Resource Locator)
GUI
(eng. Graphical User Interface)
PHP
(eng. Pesonal Home Page Tools)
ACM
(eng. Association for Computing Machinery)
IEEE-CS
(eng. The Institute of Electrical and Electronics Engineers - Computer Society)
NATO
(eng. The North Atlantic Treaty Organisation)
IBM
(eng. The International Business Machines Corporation)
Md
(eng. Domain Model)
Ma
(eng. Application Model)
API
(eng. Application programming interface)
CSS
(eng. Cascading Style Sheets)
CGI
(eng. Common Gateway Interface)
PHP/FI
(eng. Personal Home Page/Forms Interpreter)
XML
(eng. Extensible Markup Language)
SQL
(eng. Structured Query Language)
LDAP
(eng. Lightweight Directory Access Protocol)
IMAP
(eng. Internet Message Access Protocol)
SNMP
(eng. Simple Network Management Protocol)
NNTP
(eng. Network News Transfer Protocol)
POP3
(eng. Post Office Protocol 3)
COM
(eng. Component Object Model Technologies)
JSP
(eng. Java Server Pages)
GNU
(eng. Gnu's Not Unix)
PERL
(eng. Practical Extraction and Report Language)
PECL
(eng. The PHP Extension Community Library)
61