Как вы наверное уже знаете, веб-фреймворк Laravel построен по модели MVC (Модель-представление-контроллер). В этой концепции одну из ключевых ролей играет роуты (routes), выполняя маршрутизацию URL адресов в системе. Роуты позволяют сопоставить запрашиваемый адрес на сайте с методом контролера. Далее в самом контроллере происходит процесс взаимодействия с моделью и шаблонами.
При правильном подходе, для каждой записи URL в роуте можно задать уникальное название. Мы можем получать значение путей обратившись к конкретному роуту из контроллера или шаблона. Такой подход существенно сокращает вероятность появления ошибочных адресов на сайте. И в случае, если вы решили изменить какие-либо URL-адреса в проекте, то их достаточно будет поменять в самом файле роута. Стоит сразу обозначить, что тут мы будем рассматривать примеры на основе Laravel 8.x.
Приведём простой пример, допустим, что у вас в роутах прописаны несколько адресов следующего вида:
Route::get('/', function () { // })->name('home'); Route::get('/about', function () { // })->name('about'); Route::get('/contact', function () { // })->name('contact');
Чтобы не усложнять пример, мы не будет подключать контроллеры в роутах. То, на что стоит обратить внимание — это метод name(), которому мы и передаём имя конкретного роута. Зная имя какого-либо роута, мы можем вставить его URL-путь в шаблоне, таким образом:
<div class="links"> <a href="{{ route('home') }}">Home</a> <a href="{{ route('about') }}">About</a> <a href="{{ route('contact') }}">Contact</a> </div>
В итоге в тех местах подставиться URL-пути, которые заданы для этого роута. Это довольно удобно, особенно когда различных ссылок в проекте будет целое множество. Если говорить о ссылках, которые должны быть динамическими, то это можно сделать следующим образом:
В роутах мы обозначаем этот параметр в фигурные скобки:
Route::get('/page/show/{id}', function($id){ // })->name('single');
В этом случае {id} – можно будет подставлять при обращении к роуту из шаблона. В результате получать уже преобразованный путь с нужными параметрами.
<div> @foreach ($data as $item) <div class="aler alert-info"> <p>{{ $item->preview }}</p><hr> <a href="{{ route('single', $item->id) }}">Детально</a> </p> </div> @endforeach </div>
Здесь записи выводятся в цикле foreach, а ссылки подставляются через route() передавая имя роута и id-элемента. Но как быть, если необходимо передать несколько параметров? Да очень просто, передаём параметры таким же образом, только в виде массива.
В роуте задаём правило для нескольких параметров:
Route::get('/page/show/{cat_id}/{id}/', function($cat_id, $id){ // })->name('single');
В шаблоне обращается к роту как и в предыдущих примерах, лишь с небольшой разницей в передаче параметров методу route():
<div> @foreach ($data as $item) <div class="aler alert-info"> <p>{{ $item->preview }}</p><hr> <a href="{{ route('single', ['cat_id' => $item->cat_id, 'id' => $item->id]) }}">Детально</a> </p> </div> @endforeach </div>
Как вы можете заметить, изменилось только то, что мы передали методу route() в качестве второго параметра ассоциативный массив, с набором значений. Эти значения будут подставлены в путь, который будет преобразован согласно этим параметрам.
Все описанные здесь примеры — это лишь малая часть возможностей Laravel. Функциональность в действительности куда более масштабна разными возможностями. Поэтому для более детального изучения возможности использования роутов в Laravel, рекомендую смотреть в документации по фреймворку:
https://laravel.com/docs/8.x/routing#named-routes
На этом у меня пока всё, всем всего доброго!