Урок 01

Что такое роутинг

Что такое роут

Роут — правило, которое сопоставляет URL + HTTP-метод с кодом, который должен выполниться.

Пример:

GET /posts/5 → Router ищет правило → находит → вызывает Controller@show(5) → ответ

Роутинг — механизм, который делает это сопоставление.

Зачем нужен роутинг

Без роутинга:

// public/index.php
$uri = $_SERVER['REQUEST_URI'];

if ($uri === '/') {
    echo 'Главная';
} elseif ($uri === '/about') {
    echo 'О нас';
} elseif (preg_match('#^/posts/(\d+)$#', $uri, $m)) {
    echo "Пост #{$m[1]}";
} else {
    http_response_code(404);
}

Проблемы:

  • Всё в одном файле.
  • Ручной разбор.
  • Сложно тестировать.
  • Нет middleware.

С Laravel:

Route::get('/', fn () => view('home'));
Route::get('/about', fn () => view('about'));
Route::get('/posts/{post}', [PostController::class, 'show']);

Читаемо, структурировано, тестируемо.

Как это работает

При запуске приложение загружает все файлы роутов и строит таблицу маршрутов.

При запросе:

  1. Запрос приходит на public/index.php.
  2. Laravel загружает роуты (или берёт из кеша).
  3. Ищет совпадение по методу + URL.
  4. Если находит — вызывает обработчик.
  5. Обработчик возвращает ответ.

Если не находит — 404.

Файлы роутов

ФайлНазначениеMiddleware
routes/web.phpБраузерные запросыСессии, CSRF, cookie
routes/api.phpAPIStateless, throttle
routes/console.phpКоманды CLI—
routes/channels.phpBroadcast-каналы—

web.php — для сайта. api.php — для SPA / мобильных.

Простой роут

use Illuminate\Support\Facades\Route;

Route::get('/hello', function () {
    return 'Hello, world!';
});

Разбор:

  • Route::get — статический метод фасада Route.
  • '/hello' — URL.
  • Замыкание — что вернуть.

Открой http://localhost:8000/hello — увидишь текст.

Роут с контроллером

Вместо замыкания:

use App\Http\Controllers\PostController;

Route::get('/posts', [PostController::class, 'index']);
Route::get('/posts/{id}', [PostController::class, 'show']);

[Класс, метод] — вызов метода контроллера.

Замыкание — для простых случаев. Контроллер — для логики.

Ответ роута

Строка:

Route::get('/hello', fn () => 'Hello');

Массив → JSON:

Route::get('/api/status', fn () => ['status' => 'ok']);

View:

Route::get('/home', fn () => view('home'));

Response:

Route::get('/json', fn () => response()->json(['ok' => true]));

Redirect:

Route::get('/old', fn () => redirect('/new'));

Laravel сам определяет, как отдать.

Просмотр роутов

php artisan route:list

Вывод:

GET|HEAD   / ............................... 
GET|HEAD   api/user ....................... 
POST       api/posts ...................... 
GET|HEAD   api/posts ...................... 
GET|HEAD   api/posts/{post} ............... 

Что видно: метод, URL, имя, действие, middleware.

Фильтры:

php artisan route:list --path=api
php artisan route:list --method=POST
php artisan route:list --name=posts
php artisan route:list --middleware=auth
php artisan route:list --except-vendor

Кеш роутов

В проде — обязательно:

php artisan route:cache
php artisan route:clear   # очистить

Что даёт: маршруты не парсятся на каждый запрос. Ускорение 2–5 раз.

⚠️ Замыкания в роутах не кешируются — используй контроллеры.

Что дальше

  1. HTTP-методы в роутинге
  2. Параметры роутов
  3. Именованные роуты
  4. Группы роутов
  5. Контроллеры: основы
  6. Resource-контроллеры
  7. Route Model Binding
  8. Middleware
  9. Валидация в контроллерах
  10. Ответы и редиректы
  11. Продвинутый роутинг
  12. Практические паттерны

Практика

Создай простой сайт:

// routes/web.php
Route::get('/', fn () => 'Главная');
Route::get('/about', fn () => 'О нас');
Route::get('/contact', fn () => 'Контакты');

Проверь через php artisan route:list.

Открой http://localhost:8000/about.

Частые ошибки

1. Забыли use Illuminate\Support\Facades\Route:

Route::get(...);   // Class not found

2. Роут в неправильном файле:

// API-роут в web.php → нет префикса /api

3. route:cache с замыканиями:

php artisan route:cache
# Error: Unable to prepare route for serialization

Решение: используй контроллеры.

4. Роут после Route::fallback:

Route::fallback(...);
Route::get('/late', ...);   // не сработает

Решение: fallback — в конце.

Итог

  • Роут — URL + метод → код.
  • Файлы: web.php, api.php, console.php.
  • Route::get — регистрация.
  • Замыкание или [Controller::class, 'method'].
  • route:list — просмотр.
  • route:cache — кеш для прода.
  • Правило: для логики — контроллеры, не замыкания.

Дальше — HTTP-методы в роутинге.