Visoka škola strukovnih studija za informacione i komunikacione tehnologije Grupisanje ruta i patterni Školska 2017/18. Dr Nenad Kojić, dipl. inž. Luka Lukić, struk. inž. Danijela Nikitin, spec.stuk.inž
MVC.htaccess index.php Routing System Controller Model View
Rute Podsetimo se ukratko šta su rute i koja je njihova uloga u MVC arhitekuri. Da bi se pristupilo kontroleru i njegovom metodu, koji vraća neki rezultat koji krajnji korisnik vidi, neophodno je obezbediti rutu preko koje će mu se pristupiti. Rute se definišu u folderu routes/web.php
Rute Kako se kreira ruta? Route::get('/primer','PrimerController@index'); Način pristupa ruti get/post Naziv kontrolera Naziv rute kojoj će se pristupati: http://localhost/projekat/primer Naziv metode iz kontrolera koja se poziva pri gadjaju rute u URL
Rute Takođe, naučili smo i kako se prosleđuju parametri ka ruti: Route::get('/primer/{id}','PrimerController@index'); Parametar koji se prosleđuje kroz URL <?php namespace App\Http\Controllers; class PrimerController { Parametar iz URL se prihvata kao argument metoda. Argument mora imati isti naziv kao prosleđeni parametar - id } public function index($id){ // telo metoda }
Definisanje pattern-a
Definisanje pattern-a Recimo da postoji sledeća ruta: Route::get('/primer/{id}','PrimerController@index'); <?php namespace App\Http\Controllers; class PrimerController { } public function index($id){ echo $id; }
Definisanje pattern-a Sada ćemo prosleđivati različite parametre kroz URL adresu i videti rezultat.
Definisanje pattern-a Šta zaključujemo? Mi smo kreirali rutu kojoj očekujemo da se prosledi id. ID mora biti broj, što znači da moramo obezbediti da se ruti mogu proslediti samo brojevi. Postavlja se pitanje: Kako možemo definisati šta se tačno može upisati u URL adresi? Regularni izrazi!
Definisanje pattern-a U okviru metode where() se definišu pattern-i kojima se proverava vrednost prosleđenog parametra. Ukoliko vrednost prosleđenog parametra nije u skladu sa regularnim izrazom, ruta će odbaciti zahtev. Route::get('/primer/{id}','PrimerController@index')->where(['id' => '[0-9]+']); Naziv parametra Regularni izraz
Definisanje pattern-a Metoda where() očekuje asocijativni niz kao argument, pri čemu je ključ asocijativnog niza naziv parametra iz rute, a vrednost je regularni izraz. Na mestu regularnog izraza možete pisati bilo koji pattern i u skladu sa njim će biti proveren parametar koji se prosleđuje.
Primer Recimo da postoji sledeća ruta: Route::get('/primer/{id}','PrimerController@index')->where(['id' => '[0-9]+']); <?php namespace App\Http\Controllers; class PrimerController { } public function index($id){ echo $id; }
Primer Sada ćemo prosleđivati različite parametre kroz URL adresu i videti rezultat.
Patterni Recimo da imamo sledeće rute: Route::get('/korisnici/{id}', KorisniciController@index') ->where(['id' => '[0-9]+']); Route::get('/uloge/{id}', UlogeController@index') ->where(['id' => '[0-9]+']); Route::get('/predmeti/{id}','PredmetiController@index')- >where(['id' => '[0-9]+']);
Patterni Primećujemo da je metoda where() za proveru parametra id kod sve tri rute ista. Javlja se potreba da se kod optimizuje. Ovaj problem se rešava definisanjem globalnog pattern-a: Route::pattern('id', '[0-9]+'); Naziv parametra za koji se poziva provera Regularni izraz
Patterni Route::pattern('id', '[0-9]+'); Route::get('/korisnici/{id}', KorisniciController@index'); Route::get('/uloge/{id}', UlogeController@index'); Route::get('/predmeti/{id}','PredmetiController@index');
Grupisanje ruta
Grupisanje ruta Na prethodnim slajdovima smo videli da se može desiti da se za više ruta primenjuje provera istim regularnim izrazom. Ovaj problem smo rešili uvođenjem globalnog regularnog izraza. Isto tako, može se desiti potreba da nad više ruta primenimo isti Middleware ili da više ruta ima isti prefiks. Tada se javlja potreba za uvođenjem grupe ruta.
Grupisanje ruta Kreiranje grupe ruta se vrši pomoću statičke metode group() koja je definisana u klasi Route. Naziv atributa koji se primenjuje nad celom grupom Jedna ili više vrednosti atributa Route::group(['atribut' => 'vrednost' ], function(){ // rute u okviru grupe });
Primer Primer grupisanja ruta: Nije definisan nijedan atribut Route::group([ ], function() { Route::get('/korisnici', KorisniciController@index'); Route::get('/korisnici/{id}', KorisniciController@prikazJednog'); Route::post('/korisnici/izmeni/{id}', KorisniciController@izmeni'); }); http://localhost/projekat/korisnici http://localhost/projekat/korisnici/1 http://localhost/projekat/korisnici/izmeni/5
Grupisanje ruta U prethodnom primeru, primećujemo da sve rute u okviru grupe počinju sa /korisnici. Ovo se može definisati kao prefiks grupe. Naziv grupe, tj. prefiks se definiše kao prvi argument metode group(). Route::group( ['prefix' => 'naziv'], function(){ // rute u okviru grupe });
Primer Primer grupisanja ruta: Route::group(['prefix' => '/korisnici' ], function() { }); Route::get('/', KorisniciController@index'); Route::get('/{id}', KorisniciController@prikazJednog'); Route::post('/izmeni/{id}', KorisniciController@izmeni'); http://localhost/projekat/korisnici http://localhost/projekat/korisnici/1 http://localhost/projekat/korisnici/izmeni/5
Grupisanje ruta Čest je slučaj da se nad više ruta primenjuje isti Middleware, radi zaštite od neovlašćenog pristupa. Nad grupom ruta se može primeniti isti Middleware na sledeći način: Route::group(['middleware' => ['naziv_middleware']], function(){ // rute u okviru grupe });
Primer Primer sa middleware: Route::group(['middleware' => 'auth'], function() { }); Route::get('/korisnici', KorisniciController@index'); Route::get('/korisnici/{id}', KorisniciController@prikazJednog'); Route::post('/korisnici/izmeni/{id}', KorisniciController@izmeni');
Primer Primer sa primenom više middleware-a: Route::group( [ 'middleware' => ['auth', 'role'] ], function() { }); Route::get('/korisnici', KorisniciController@index'); Route::get('/korisnici/{id}', KorisniciController@prikazJednog'); Route::post('/korisnici/izmeni/{id}', KorisniciController@izmeni');
Visoka škola strukovnih studija za informacione i komunikacione tehnologije Grupisanje ruta i patterni Školska 2017/18. Dr Nenad Kojić, dipl. inž. Luka Lukić, struk. inž. Danijela Nikitin, spec.stuk.inž