spiritBreaker
LaravelMaster
Во ларавел, сите риквести се мапирани со помош на рути. Тие рути, ги насочуваат риквестите кон анонимни функции или кон одредени контролери. Сите документи се кои ја содржат логиката за рутите се сместени во routes фолдерот. Овие фајлови се автоматски вчитани од страна на ларавел. Дефинирање на рути за веб интерфејсот се дефинирани во routes/web.php (на нив им е доделена web групата од middleware - и која се грижи за многу работи како на пример сесијата, csrf заштита итн), додека рутите за api интерфејсот се дефинирани во routes/api.php. Рутерот на ларавел ги поддржува следните HTTP verbs :
Важно: за следните примери, ќе ги користиме рутите за веб интерфејс, односно рутите сместени во routes/web.php.
Многу често, во дефиниција на рутите би можеле да ги сретнете следниве примери:
Како и:
Доколку погледнеме поубаво, првата рута започнува со / , а втората не. Сум сретнал повеќе дебати дали е правилно да започнуваат рутите со / префикс или не, но на крај се сведува на лична преференца на програмерот. И двата примери се точни; доколку не ставиме / како префикс на почеток на рутата, ларавел ќе се погрижи и ќе го направи тоа за нас во позадина.
Во погорниот пример со рути, ги видовме рутите кои содржат post, put, patch или delete. Доколку сакаме да испратиме некоја форма на некоја рута, и ја дефинираме на пример на следниот начин:
А рутата ни е дефинирана на следниот начин:
И кликнеме на копчето Subscribe to newsletter, тогаш ќе бидеме пренасочени кон друга страна и ќе добиеме грешка 409 expired. Ова значи дека POST риквестот не испратил csrf токен до рутата (кој се проверува од страна на VerifyCsrfToken middleware – oт) и го смета како csrf напад. За да ги немаме овие проблеми, ларавел има лесен и едноставен начин на генерирање на csrf токен, а проверката на валидноста на тој токен се прави автоматски од страна на ларавел. Се што треба да направиме во тој случај е да додадеме @csrf во самата форма, па формата, сега ќе изгледа вака:
@csrf ќе генерира скриено поле во формата кое ја има вредноста на моменталниот токен.
За да сево ова биде валидирано, ларавел во сесија го зачувува и самиот csrf токен, кој, како што спомнавме претходно, е енкриптиран, и при испраќање на формата го валидира испратениот токен дали одговара на зачуваниот токен во сесија.
Доколку ги имаме следниве две рути:
Ларавел има едноставно и симплифицирано совпаѓање до двете рути без пишување на овие два реда.
Во овој случај, доколку сакаме да го прошириме ова, можеме да направиме:
Се прашувате: што ако методот е POST, а сакам да го рутирам во некој метод од контролер? Тогаш е лесно, се што треба да направите е:
Доколку имаме рута која што враќа некој view, природно би дошло да се напише следново:
Но секако, постои поедноставен начин за истото, односно:
Параметри во рути
Доколку имаме рута, пример: user/11 <- каде 11 е динамичка бројка, тогаш дефинирањето на рутата е на следниот начин:
Уште еден пример:
Секогаш кога ќе користиме анонимна функција (closure) во рутите, и притоа пуштаме динамички параметри, тие параметри треба да се параметри и во анонимната функција, како што е прикажано во погорните два примери.
Доколку параметарот што го пуштаме е опционален, тогаш, при дефинирање на рутата се прави:
Со додавање на ? после името на параметарот, му кажуваме на ларавел дека параметарот е опционален.
Регуларни експресии за динамичките параметри во рутите
Доколку сакаме да провериме дали некој од параметрите одговара на некоја шема која што сакаме да ја наметниме, на пример: {id} да е само бројки, {name} да се само карактери, тогаш, се прави следното:
Именувани рути
Доколку сакаме на некоја рута да и дадеме име, а да немора да ја пишуваме целата(доколку е подолга рута), тогаш, во дефиницијата на рутата, можеме да ја именуваме, односно:
Доколку во view – то сакаме да пристапиме до именуваната рута, наместо да пишуваме user/profile, можеме да пристапиме само:
Доколку сакаме да пренасочиме до именуваната рута, пример од некоја друга рута, тогаш, се прави следното:
Групирање на рути
Понекогаш, може да ги имаме следниве рути:
За да немаме дуплирање на редови, а на сите заеднички им е префиксот /admin/, тогаш можеме да ги групираме овие рути на следниот начин:
Доколку некои од контролерите што сакаме да ги користиме, се наоѓаат на пример во namespace – от Admin, тогаш постојат два начини за рутирање кон метод.
Или, со групирање:
Код:
Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Важно: за следните примери, ќе ги користиме рутите за веб интерфејс, односно рутите сместени во routes/web.php.
Многу често, во дефиниција на рутите би можеле да ги сретнете следниве примери:
Код:
Route::get(‘/users/all’, function() { … });
Како и:
Код:
Route::get(‘users/all’, function() { … });
Доколку погледнеме поубаво, првата рута започнува со / , а втората не. Сум сретнал повеќе дебати дали е правилно да започнуваат рутите со / префикс или не, но на крај се сведува на лична преференца на програмерот. И двата примери се точни; доколку не ставиме / како префикс на почеток на рутата, ларавел ќе се погрижи и ќе го направи тоа за нас во позадина.
Во погорниот пример со рути, ги видовме рутите кои содржат post, put, patch или delete. Доколку сакаме да испратиме некоја форма на некоја рута, и ја дефинираме на пример на следниот начин:
Код:
<form method="POST" action="/subscribe">
<input type=”text” name=”email” placeholder=”Enter your email”>
<input type=”submit” name=”submit” value=”Subscribe to newsletter”>
</form>
А рутата ни е дефинирана на следниот начин:
Код:
Route::post(‘/subscribe’, ‘SubscriberController@newSubscriber’);
И кликнеме на копчето Subscribe to newsletter, тогаш ќе бидеме пренасочени кон друга страна и ќе добиеме грешка 409 expired. Ова значи дека POST риквестот не испратил csrf токен до рутата (кој се проверува од страна на VerifyCsrfToken middleware – oт) и го смета како csrf напад. За да ги немаме овие проблеми, ларавел има лесен и едноставен начин на генерирање на csrf токен, а проверката на валидноста на тој токен се прави автоматски од страна на ларавел. Се што треба да направиме во тој случај е да додадеме @csrf во самата форма, па формата, сега ќе изгледа вака:
Код:
<form method="POST" action="/subscribe">
@csrf
<input type=”text” name=”email” placeholder=”Enter your email”>
<input type=”submit” name=”submit” value=”Subscribe to newsletter”>
</form>
@csrf ќе генерира скриено поле во формата кое ја има вредноста на моменталниот токен.
За да сево ова биде валидирано, ларавел во сесија го зачувува и самиот csrf токен, кој, како што спомнавме претходно, е енкриптиран, и при испраќање на формата го валидира испратениот токен дали одговара на зачуваниот токен во сесија.
Доколку ги имаме следниве две рути:
Код:
Route::get(‘/posts’, ‘PostsController@getAllPosts’);
Route::post(‘/posts’, ‘PostsController@addNewPost);
Ларавел има едноставно и симплифицирано совпаѓање до двете рути без пишување на овие два реда.
Код:
Route::match(['get', 'post'], '/posts, function(Request $request){
dd($request->getRealMethod());
});
Во овој случај, доколку сакаме да го прошириме ова, можеме да направиме:
Код:
Route::match(['get', 'post'], '/posts , function(){
$method = request()->getRealMethod();
if($method == "GET"){
return view('someview');
}
else {
//do something here
}
Се прашувате: што ако методот е POST, а сакам да го рутирам во некој метод од контролер? Тогаш е лесно, се што треба да направите е:
Код:
Route::match(['get', 'post'], '/posts , function(){
$method = request()->getRealMethod();
if($method == "GET"){
return view('someview');
}
else {
return redirect()->action('PostsController@addNewPost', ['id' => 1, 'name' => 'john' ...]);
}
Доколку имаме рута која што враќа некој view, природно би дошло да се напише следново:
Код:
Rote::get(‘/someroute’, function(){
return view(‘some.view.here’);
});
Но секако, постои поедноставен начин за истото, односно:
Код:
Route::view(‘/someroute’, ‘some.view.here’);
Параметри во рути
Доколку имаме рута, пример: user/11 <- каде 11 е динамичка бројка, тогаш дефинирањето на рутата е на следниот начин:
Код:
Route::get('user/{id}', function ($id) {
return 'User '.$id;
});
Уште еден пример:
Код:
Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
//
});
Секогаш кога ќе користиме анонимна функција (closure) во рутите, и притоа пуштаме динамички параметри, тие параметри треба да се параметри и во анонимната функција, како што е прикажано во погорните два примери.
Доколку параметарот што го пуштаме е опционален, тогаш, при дефинирање на рутата се прави:
Код:
Route::get('user/{name?}', function ($name = null) {
return $name;
});
Route::get('user/{name?}', function ($name = 'John') {
return $name;
});
Со додавање на ? после името на параметарот, му кажуваме на ларавел дека параметарот е опционален.
Регуларни експресии за динамичките параметри во рутите
Доколку сакаме да провериме дали некој од параметрите одговара на некоја шема која што сакаме да ја наметниме, на пример: {id} да е само бројки, {name} да се само карактери, тогаш, се прави следното:
Код:
Route::get('user/{name}', function ($name) {
//
})->where('name', '[A-Za-z]+'); //name is characters only, upper and lower case
Route::get('user/{id}', function ($id) {
//
})->where('id', '[0-9]+'); //id is only a number
Route::get('user/{id}/{name}', function ($id, $name) {
//
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']); //id and name are both validated
Именувани рути
Доколку сакаме на некоја рута да и дадеме име, а да немора да ја пишуваме целата(доколку е подолга рута), тогаш, во дефиницијата на рутата, можеме да ја именуваме, односно:
Код:
Route::get('user/profile', function () {
//
})->name('profile');
Доколку во view – то сакаме да пристапиме до именуваната рута, наместо да пишуваме user/profile, можеме да пристапиме само:
Код:
{{ route(‘profile’) }}
Доколку сакаме да пренасочиме до именуваната рута, пример од некоја друга рута, тогаш, се прави следното:
Групирање на рути
Понекогаш, може да ги имаме следниве рути:
Код:
Route::get(‘/admin/pages’, function() { … });
Route::get(‘/admin/users, function() { … });
Route::get(‘/admin/logs’, function() { … });
За да немаме дуплирање на редови, а на сите заеднички им е префиксот /admin/, тогаш можеме да ги групираме овие рути на следниот начин:
Код:
Route::prefix('admin')->group(function () {
Route::get('users', function () {
//
});
Route::get(pages, function () {
//
});
});
Доколку некои од контролерите што сакаме да ги користиме, се наоѓаат на пример во namespace – от Admin, тогаш постојат два начини за рутирање кон метод.
Код:
Route::get('/photos',['as'=>photos.index','uses'=>'Photos\PhotosController@index']);
Или, со групирање:
Код:
Route::group(['prefix' => 'photos', 'namespace' => 'Photos'], function() {
Route::get('/', 'PhotosController@index');
});