MVC
Dr Nenad Kojić, dipl. inž.Luka Lukić, dipl. inž.
Školska 2018/19. Danijela Nikitin, spec .stuk.inž.
Visoka škola strukovnih studija za informacione
i komunikacione tehnologije
Prvo da se završi instalacija…
Instalacija Laravela
Prvo treba preuzeti composer sa:
https://getcomposer.org/
Instalacija Laravela
Zatim se preuzima cmder sa:
http://cmder.net/
Raspakovati u:
Instalacija Laravela
Pokrenuti Cmder, pozicionirati se u htdocs folder i otkucati sledeće komande:
• composer require global laravel/installer (instalacija Laravela)
• laravel new ime_projekta (pravi se folder sa svim neophodnimfajlovima)
Nakon instalacije…
Stuktura fajlova
• Nakon instalacije, folder u kome se nalazi Laravel
Stuktura fajlova
• Za početak rada, od suštinskog značaja su sledeći folderi i njihov sadržaj: app – smešteni modeli i kontroleri public – nalazi se sav javni sadržaj (slike, javascript,css) resources – views, raw un-compiled assets (LESS, SASS, JavaScript)
routes – definisanje i upravljanje rutama
.env – osnovni konfiguracioni parametri
Dobili smo MVC. Šta sa tim?
MVC arhitektura
• MVC arhitektura je softverski patern koji odvaja prikaz informacija od interakcije korisnika sa tim informacijama
• MVC predstavlja akronim od Modle-View-Controller
• Proteklih nekoliko godina postala je jako popularna strategija za organizaciju web aplikacija
• Ideja je da se aplikacija podeli u tri celine: Model, View, Controller
MVC arhitektura
Controller
• Centralni deo aplikacije, upravlja korisničkim zahtevima i na osnovu zahteva vraća odgovarajući odgovor (request – response, učitava view sa podacima iz modela, vraća json podatke...)
• Tumači i upravlja HTTP zahtevima
• Poziva Model, menja ili dohvata podatke i, ako je potrebno bira koji view će se učitati kao response
MVC arhitektura
View
• Korisnički interfejs, služi za prikaz podataka dobijenih iz modela
• Može da šalje zahtev kontroleru za izmenu prikazanih podataka
• Aplikacija se najčešće sastoji iz većeg broja view-a
• U web aplikacijama, view je fajl u kome se nalazi HTML
• Postoje „templating engine-i“ koji olakšavaju pravljenje view-a (blade, twig)
MVC arhitektura
Model
• Model obezbeđuje podatke i biznis logiku aplikacije
• To postiže tako što obezbeđuje komunikaciju sa bazom ili nekim drugim izvorom podataka
• Ne zna za HTML, web server, browser niti slično, samo pruža način upravljanja podacima (dohvatanje, izmena, brisanje) Ranije…
Proceduralni pristup
index.php
kontakt.php
proizvodi.php
Podfolder, sa dodatnim
fajlovima
http://localhost/projekat/index.php
http://localhost/projekat/proizvodi.php
http://localhost/projekat/kontakt.php
Proceduralni pristup
index.php
Database
kontakt.php
Database
C:/xampp/htdocs/projekat/index.php C:/xampp/htdocs/projekat/kontakt.php
Sada…
MVC pristup
.htaccess index.php
Controller Model
View
Routing System
Realizacija MVC-a
• U root-u sajta (osnovni public folder) se nalazi .htaccess fajl koji svaki zahtev preusmerava na index.php stranu
• index.php odatle dalje prosleđuje zahtev i poziva sistem za rutiranje
• Sistem za rutiranje interpretira URL adresu i na osnovu nje učitava određen kontroler i njegov metod
Realizacija MVC-a
• Šta je i čemu služi fajl .htaccess?
• .htaccess je konfiguracioni fajl koji direktno menja podešavanja Apache servera
• Ovim fajlom se mogu promeniti podrazumevana podešavanja za Apache i ona će važiti samo za folder u kome se nalazi ovaj fajl
• Služi da dozvoli/zabrani pristup određenim fajlovima i folderima, da se izvrši redirekcija sa jedne stranice na drugu itd...
• Ukoliko ne postoji tražena strana, korisnik se preusmerava na 404 stranu
Rutiranje – veza browsera i koda
Rutiranje u Laravelu
• Nakon pristizanja HTTP zahteva, on biva preusmeren na Laravel-ov sistemza rutiranje, koji interpretira URL adresu, i na osnovu nje poziva odgovarajući kontroler i njegov metod
• Metod u kontroleru zatim obavlja potrebnu logiku, ako ima potrebe poziva model i na kraju učitava view
• Tim oblikom komunikacije je obuhvaćen je MVC princip projektovanja
• Ruta je sve što se nalazi iza baznog dela URL adrese sajta
• http://pera.com/ruta bazni deo { http://pera.com }
ruta { /ruta }
Definisanje rute
• Folder za rute se nalazi u root-u projekta, u folderu routes
• Fajl u kome se kreiraju rute je web.php
Definisanje rute
• Folder za rute se nalazi u root-u projekta, u folderu routes
• Fajl u kome se kreiraju rute je web.php
Poziv kontrolera preko rute
• Ruta se u Laravelu definiše pomoću klase Route i njenih statičkih metoda get, post, put, patch, delete i options
• Najčešće se koriste get i post, dok se ostali koriste za realizaciju web servisa
• Statički metod je metod koji nije vezan ni za jednu konkretnu instancu klase, već važi na nivou klase
• Statički metod se poziva preko imena klase, ako se poziva van klase ili rezervisane reči self ukoliko se poziva unutar definicije klase
Poziv kontrolera preko rute
• Primer definicije statičkog metodaclass Primer
{
public static function proba()
{
return “Proba”;}
}
• Primer poziva statičkog metoda• Unutar metoda neke druge klase: Primer::proba()
• Unutar metoda klase čiji je član taj statički metod: self::proba()
Rad sa rutama - basic Rad sa rutama - basic
Rad sa rutama - basic Poziv kontrolera preko rute
• Svaki od navedenih metoda predstavlja tip HTTP zahteva koji se na toj ruti očekuje
• Kao prvi parametar metodu rute se prosleđuje ruta u string formatu, koja se očekuje iz URL adrese, dok drugi ukazuje na konkretan kontroler i njegov metod
• Karakter @ u drugom parametru razdvaja ime kontrolera od imena metoda tog kontrolera
Poziv kontrolera preko rute
Ako preko browsera posetimo adresu: http://www.nekisajt.com/strana
Ruta koja će se pozvati biće /strana
Potrebno je definisati koji kontroler i metod se učitavaju prilikom gađanja ove rute:
Route::get(“/strana”, “kontroler@metod”);
Klasa za rutiranje
Statički metod zadužen za GET tip request-a
Ime kontrolera koji se
poziva
Metod unutar kontroleraruta
Poziv kontrolera preko rute
• Konkretna ruta poziva kontroler i njegov metod, koji ucitava željeni view, koji se prikazuje na kraju prikazuje korisniku
Primer
Route::get('/kontakt',
'KontaktController@prikaz_kontakt');
Route::get('/kontakt/{fname}/{sname}',
'KontaktController@dohvati_kontakt');
Route::get('/kontakt', 'KontaktController@prikaz_kontakt');
Route::get('/kontakt/{fname}/{sname}', 'KontaktController@dohvati_kontakt');
Kreiranje konrolera – unapred…
Kreiranje konrolera – unapred…
Na početnu i na kraju OOP…
Klase u Laravelu
• Svaki kontroler u Laravelu je klasa
• Klase u Laravelu se automatski učitavaju po „Standardu za automatsko učitavanje“koje je definisao http://www.php-fig.org/
• Trenutni standard za automatsko učitavanje klasa je PSR4
• Da bi po navedenom standardu klasa mogla da se automatski učita pomoću loader-a obezbeđenog composer-om, ona mora da ima definisan imenski prostor (imenski prostor govori funkciji za automatsko učitavanje gde se klasa nalazi unutar hijerarhije foldera projekta)
• Imenski prostor se definiše rezervisanom rečju namespace i uvek se piše kao prva direktiva u klasi
Prosleđivanje parametara iz rute
Rad sa resource (route:list)
Bez metoda
Za pozivanje u kodu
(linkovi npr.)
Upotreba metoda show()
Rad sa resource
• Ako se za primer uzme metod show, i u njegovom telu napiše• public function show($id)
{
return "Ovo je metod show sa parametrom: " . $id;
}
• Ako se on pozove kao u listingu sa
GET|HEAD | artikli/{artikli} | artikli.show
Klase u Laravelu
• Definisanje klase u Laravelu koju je moguće automatski učitati
• Klasa se nalazi u imenskom prostoru App\Klase\Primeri. U definiciji imenskogprostora (namespace) ne treba navoditi ime klase!
• Prilikom kreiranja instance klase, neophodno je navesti potpuno kvalifikovano ime klase.
• Potpuno kvalifikovano ime klase se navodi celim imenskim prostorom zajedno sa imenom klase (za razliku od definicije namespace-a) i koristi se pri pravljenju instance klase.
Klase u Laravelu
namespace App\Klase\Proba\Primeri;
class Primer
{
public $polje1;
public $polje2;
public function metod()
{
return $this->polje1;
}
}
Ovakvom definicijom klase kasnije ju je moguće instancirati i koristiti bilo gde unutar projekta.
Primer poziva klase:
$instanca = new App\Klase\Proba\Primeri\Primer();
Potpuno kvalifikovano ime
klase (sadrži namespace [App\Klase\Primeri] i ime
klase [Primer])
Klase u Laravelu
• Namespace klase može da postane veoma dugačak i težak za pamćenje
• Zbog toga je uvedena rezervisana reč use koja govori da će se u tekućem fajlu koristiti klase iz navedenog namespace-a
• Definiše se uvek ispod namespace-a, a iznad definicije klase
• Sledi primer klase koja koristi instancu klase koju smo definisali na prethodnom slajdu. Klasa se nalazi u imenskom prostoru App\Klase\Primeri i zove se Proba
namespace App\Klase\Primeri;
use App\Klase\Proba\Primeri\Primer;
class TestKlasa
{
public function test()
{
return new Klasa(); //vraca instance klase definisane na slajdu iznad
}
}
//Klasa se nalazi u: app/Klase/Primeri/TestKlasa.php
Kontroleri u Laravelu
• Svi kontroleri u Laravelu se nalaze u folderu app/Http/Controllers
• Kontroler je klasa! Neophodno je i da ime fajla i ime klase počinju velikim slovom
• Kao i bilo koja druga klasa, kontroler ima svoja polja i metode
• Prilikom definisanja rute u routes/web.php navodi se ime kontrolera i imemetode koja se u tom kontroleru poziva
• Neophodno je navesti imenski prostor (namespace)
Kontroleri u Laravelu
• Definisanje kontrolera
namespace App\Http\Controllers;
class Kontroler
{
public function metod()
{
return view(‘home’); //Funkcija koja učitava view ‘home.blade.php’ izfoldera resources/views
}
}
View
• Kontroler i model su klase, dok samo View predstavlja PHP stranicu tj fajl
• U ovom fajlu se nalazi sav potreba kod za prikaz podataka korisniku
• Tu se nalazi sav statički i dinamički deo web strane tj. ceo HTML, CSS, JS kod, ali i PHP kod za dinamičku obradu i prikaz podataka
• Svi view-ovi se nalaze u folderu recources/views
• Svaki view ima ekstenziju blade.php
• Blade je template engine i dozvoljava naprednu upotrebu PHP-a za potrebe generisanja dinamičkih web stranica
• Fajlovi u views mogu biti raspoređeni u proizvoljne podfoldere
Inicijalni view
Poziv view-a preko kontrolera
• Kontroler funkcijom view(‘home’) učitava istoimeni view iz foldera resources/views
• Ne treba navoditi ekstenziju “.blade.php”
web.php
home.blade.php
Kontroler.php
Kreiranje novog view-a
• Novi view se pravi kao klasična PHP stranica sa HTML/CSS sadržajem
• Pretpostavimo da se pravi view kao na slici (prikaz.blade.php)
Korekcije u kontroleru
• Pretpostavimo da krećemo od napravljenog kontrolera ProizvodiController, i njegovo metoda show() koji je dohvatai i prikazivao parametar iz URL adrese
• Ovo je bilo do sada:
• Tj. pozivanjem se dobijalo:
Pozivanje view-a
• Ako se sada iz kontrolera pozove view kao
• Sada se pozivanjem dobija :
• Ovo je statički prikaz! Uvek isti!
Prosleđivanje parametara
• Podaci se nalaze u kontroleru
• U kontroler mogu da stignu ili iz rute ili iz modela
• Ako taj podatak treba da se prikaže korisniku, onda se iz kontrolera mora proslediti view-u
• Postoji više načina da se podatak prosledi pozvanom view-u
1. Metod with()
1. Metod with()
• Kontroler
• View
• Poziv
2. Funkcija compact()
• Kontroler
• View
• Poziv
2. Funkcija compact() – više parametara
• Kontroler
• View
• Poziv
2. Funkcija compact() – više parametara -alternativa
• Kontroler
• View
3. Drugi argument view-a (data)
• Kontroler
• View
3. Drugi argument view-a (niz)
• Kontroler
• View
I tako podatak iz kontrolera stiže do view-a!
Šta sada?- Greške
Najčešće greške - kontroler
• Greška koja nastaje kada nije definisan kontroler
Najčešće greške - metod
• Greška koja nastaje kada nije definisan metod u kontroleru
Najčešće greške - ruta
• Greška koja nastaje kada nije dobro definisana ruta
Model je poslednji element MVC-a- Klasa zadužena za rad sa podacima
Modeli u Laravelu
• Do sada smo obradili C i V delove MVC arhitekture
• Model je zadužen za obradu i dohvatanje podataka i najčešće je realizovan kroz rad sa bazom podataka
• Dohvatanje i obradu podataka delegira kontroler
• Kontroler podatke dobijene od modela dalje prosleđuje view-u kako bi se oni prikazali
• Sve modele smeštamo u folder app/Models. On nije inicijalno napravljen ineophodno ga je napraviti ručno
Modeli u Laravelu
• Da bismo ostvarili vezu sa bazom, neophodno je da podesimo pristupne parametre
• Pristupni parametri se, pored ostalih konfiguracija definišu u fajlu .env u root-u
• Nakon podešenih pristupnih parametra kreiramo folder app/Models
Modeli u Laravelu
• Kao i kontroler, i model je klasa
• Važe ista pravila za imenski prostor kao i u kontroleru
• Definisanje modela:
<?php
namespace App\Models;
class ModelPrimer {
public function dohvatiPodatke()
{
return Array("Pera", "Mika", "Laza");
}
}
Napravljeni model ne radi ništa pametno, sadrži jedan metod koji vraća niz. Kasnije u primerima će se raditi sa bazom podataka.
Modeli u Laravelu
• Sada smo definisali svaki element MVC-a
• Sledeći korak je da kontroler učita model, iz njega dohvati podatke i prosledi ih view-u za prikaz
• Krećemo tako što definišemo rutu
Route::get(‘/test’, ‘kontroler@metod’);
routes/web.php
Modeli u Laravelu
• Nakon kreiranja rute, pravimo kontroler i metod koje ta ruta poziva
• Kontroler u svom metodu kreira instancu model-a i poziva metoddohvatiPodatke(), koji kao rezultat vraća niz koji se prosleđuje view-u
Kod za kontroler (app\Http\Controllers\Kontroler.php)
<?php
namespace App\Http\Controllers;
use App\Models\ModelPrimer;
class Kontroler
{
public function metod()
{
$modelInstanca = new ModelPrimer();
$podaci = $modelInstanca->dohvatiPodatke();
return view('home', [
’skupPodataka' => $podaci
]);
}
}
Kod za model (app\Models\ModelPrimer.php)
<?php
namespace App\Models;
class ModelPrimer {
public function dohvatiPodatke()
{
return array('Pera', 'Mika', 'Laza');
}
}
Modeli u Laravelu
• Da bi sve to moglo da radi, neophodno je da postoji navedeni view (ime view-a je home)
• View sadrži HTML kod i nalazi se u folderu resources/views
• Ima ekstenziju .blade.php, tako da je konkretan fajl home.blade.php
Kod za view
<html>
<head>
<title>View proba</title>
</head>
<body>
<ul>
<?php
foreach($skupPodataka as $podatak) {
echo "<li>" . $podatak . "</li>";
}
?>
</ul>
</body>
</html>
Krajnji prikaz
resources/views/home.blade.php
Tako je podatak iz Modela došao do Kontrolera, a on ga dalje prosledio View na prikaz!
Da li je ovo realno?Da ali ne sa fix podacima u modelu, jer oni treba da se tu dobiju iz baze podataka.Zato, idemo dalje!
MVC
Dr Nenad Kojić, dipl. inž.Luka Lukić, dipl. inž.
Školska 2018/19. Danijela Nikitin, spec .stuk.inž.
Visoka škola strukovnih studija za informacione
i komunikacione tehnologije
Top Related