После установки Laravel в нём содержится только один маршрут. Его можно найти в файле web.php. Его содержание
<?php
Route::get('/', function () {
return view('welcome');
});
?>
Первым параметром метод get принимает адрес URI (относительный адрес страницы сайта, без домена).Второй параметр - это анонимная функция, которая возвращает результат работы функции view. Эта функция только подготавливает переменную к выводу. Её легко можно заменить простым текстом. К примеру, можно написать так, результат работы скрипта останется прежним:
<?php
Route::get('/', function () {
return 'welcome';
});
?>
Как можно догадаться, в файле web.php можно самостоятельно задать любое количество маршрутов, просто продублировав код из примера выше. Давайте попробуем таким образом сделать несколько страниц сайта по разным адресам:
<?php
Route::get('/', function () {
return 'титульная страница';
});
Route::get('/contacts/', function () {
return 'страница контактов';
});
Route::get('/news/1/', function () {
return 'новость детально';
});
?>
Таким образом мы задали сразу три страницы сайта, на которые можно перейти - это титульная, страница контактов и страница детального просмотра новости. Как можно заметить, в последнем примере мы использовали цифру "1" в адресе. Для этого была цель вывести только новость с id равным 1. Но что нам делать, если нужно запрограммировать вывод сотни новостей? Очевидно, что вызывать метод get сотню раз нерационально. Поэтому используем параметр в адресе.
Обязательные параметры
Попробуем переписать предыдущий пример с обращением к странице с детальным текстом новости. Изменим его, чтобы сделать захват id новости из адреса страницы. При этом надо добавить одноимённую переменную в аргумент функции. Получится так:<?php
Route::get('/news/{id}/', function ($id) {
return 'новость под номером ' . $id ;
});
?>
Теперь если перейти по адресу /news/5/
, то на странице можно будет увидеть текст "новость под номером 5". Можно определить сразу несколько параметров:
<?php
Route::get('/news/{section}/{id}/', function ($section, $id) {
return 'новость под номером ' . $id . ' из раздела ' . $section;
});
?>
Если перейти по адресу /news/mouse/5/
, то на странице можно будет увидеть текст "новость под номером 5 из раздела mouse".Обратите внимание, что мы не забыли поставить в аргумент функции сразу две переменные: $id и $section.
Параметры в адресе всегда заключаются в фигурные скобки
Параметров в адресе может быть много. Но при подобной записи (как в примерах выше) они все являются обязательными. То есть если все из не написать, то правило маршрута не сработает. Но существует возможность сделать параметр необязательным.
{ ... }
. В их названии нельзя писать тире "-". Вместо него используйте подчёркивание.Необязательные параметры маршрута
Попробуем сделать параметр необязательным, чтобы маршрут срабатывал даже при отсутствии параметра. Для этого необходимо после параметра поставить знак вопроса "?". При этом не стоит забывать про значение по умолчанию для необязательного параметра - его надо поставить функции из второго параметра в аргументах:<?php
Route::get('/news/{section?}/{id}/', function ($section = 'mouse', $id) {
return 'новость под номером ' . $id . ' из раздела ' . $section;
});
?>
Теперь маршрут будет срабатывать и на адрес /news/5/
и на /news/mouse/5/
. Но на странице /news/5/
будет показан текст "новость под номером 5 из раздела mouse"
Ограничения регулярными выражениями
Параметры из маршрутов никак не очищаются. поэтому стоит позаботиться о безопасности и сделать хотя бы отсев плохих символов регулярному выражению. Делается это с помощью метода "where", в который надо передать название переменной и регулярное выражение, которое применится к нему.К примеру, если мы хотим оставить только цифры в переменной, то регулярное выражение будет таким:
<?php
Route::get('/news/{id}/', function ($id) {
return 'новость под номером ' . $id ;
})->where('id', '[0-9]+');
?>
Если нужно сделать отсев по латинским буквам всех регистров, то получится так:
<?php
Route::get('/news/{section}/', function ($section = 'mouse') {
return 'новость из раздела ' . $section;
})->where('section', '[A-Za-z]+');
?>
Если переменных несколько, то нужно использовать массив:
<?php
Route::get('/news/{section}/{id}/', function ($section, $id) {
return 'новость под номером ' . $id . ' из раздела ' . $section;
})->where(['id' => '[0-9]+', 'section' => '[a-z]+']);
?>