Именованные маршруты

Именованные маршруты позволяют назначать маршрутам понятные имена, что упрощает генерацию URL-адресов и выполнение переадресаций в приложении.

Основы именования маршрутов

Чтобы присвоить маршруту имя, используйте метод name():

Route::get('/user/settings', $callback)->name('settings');
PHP

Важно: Имена маршрутов должны быть уникальными в рамках всего приложения.

Генерация URL для именованных маршрутов

После назначения имени маршруту вы можете легко создавать URL-адреса:

// Базовый способ
$url = route('settings'); // Вернёт: /user/settings

// В шаблонах
<a href="{{ route('settings') }}">Настройки</a>
PHP

Генерация URL с параметрами

Если маршрут содержит параметры, передайте их как массив:

// Определение маршрута с параметром
Route::get('/user/{id}/profile', $callback)->name('profile');

// Генерация URL с параметром
$url = route('profile', ['id' => 1]); // Результат: /user/1/profile
PHP

Дополнительные параметры в строке запроса

Дополнительные параметры автоматически добавляются в строку запроса:

$url = route('profile', [
    'id' => 1,            // Обязательный параметр маршрута
    'images' => 'yes',    // GET-параметр
    'sort' => 'date'      // GET-параметр
]);

// Результат: /user/1/profile?images=yes&sort=date
PHP

Переадресация на именованные маршруты

Для перенаправления на именованные маршруты используйте:

class MyController
{
    public function __invoke()
    {
        // Обработка данных...
        
        return redirect()->route('settings');
        // или
        return to_route('settings');
    }
}
PHP

Проверка маршрута

Проверка существования маршрута

if (Route::has('settings')) {
    // Маршрут существует
}
PHP

Проверка текущего маршрута

Вы можете проверить, соответствует ли текущий запрос определённому именованному маршруту:

// В middleware
class CheckAccessMiddleware
{
    public function handle($request, Closure $next)
    {
        if ($request->route()->named('admin.*')) {
            // Проверка прав для всех админских маршрутов
            if (!auth()->user()->isAdmin()) {
                abort(403);
            }
        }
        
        return $next($request);
    }
}

// В контроллере или любом другом месте
if (request()->route()->named('profile')) {
    // Действия для маршрута профиля
}
PHP

Лучшие практики

  1. Используйте точечную нотацию для группировки связанных маршрутов:
Route::post('/posts/{id}')->name('posts.update');
PHP
  1. Проверяйте существование маршрута перед использованием
  2. Создавайте константы для имён маршрутов в больших проектах
class RouteNames
{
    public const POSTS_INDEX = 'posts.index';
    public const POSTS_SHOW = 'posts.show';
}

// Создание маршрута
Route::get('/posts')->name(RouteNames::POSTS_INDEX);

// Использование
return redirect()->route(RouteNames::POSTS_INDEX);
PHP