Маршруты в Laravel

В фреймворке Laravel маршруты представляют собой статический метод get класса Route. Маршруты определяют что именно фреймворк будет показывать при обращении к определённому адресу.

После установки 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]+']);
?>
MouseDC.ru - хостинг, виртуальный хостинг, покупка доменов, проверка доменов, WHOIS, курсы создания сайтов, вебинары по созданию, курсы разработки сайтов, доработка сайтов, сопровождение сайтов, разработка сайтов, техподдержка сайтов
Была ли эта статья полезна? Есть вопрос?
Cмотрите другие статьи: