Upload
trandan
View
219
Download
0
Embed Size (px)
Citation preview
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
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 neophodnim
fajlovima)
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 sistem za 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 metoda
class 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 definicijiimenskog prostora (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 ime
metode 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’ iz
foldera 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 i
neophodno 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 metod
dohvatiPodatke(), 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