Что такое роутинг
Что такое роут
Роут — правило, которое сопоставляет 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']);
Читаемо, структурировано, тестируемо.
Как это работает
При запуске приложение загружает все файлы роутов и строит таблицу маршрутов.
При запросе:
- Запрос приходит на
public/index.php. - Laravel загружает роуты (или берёт из кеша).
- Ищет совпадение по методу + URL.
- Если находит — вызывает обработчик.
- Обработчик возвращает ответ.
Если не находит — 404.
Файлы роутов
| Файл | Назначение | Middleware |
|---|---|---|
routes/web.php | Браузерные запросы | Сессии, CSRF, cookie |
routes/api.php | API | Stateless, throttle |
routes/console.php | Команды CLI | — |
routes/channels.php | Broadcast-каналы | — |
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 раз.
⚠️ Замыкания в роутах не кешируются — используй контроллеры.
Что дальше
- HTTP-методы в роутинге
- Параметры роутов
- Именованные роуты
- Группы роутов
- Контроллеры: основы
- Resource-контроллеры
- Route Model Binding
- Middleware
- Валидация в контроллерах
- Ответы и редиректы
- Продвинутый роутинг
- Практические паттерны
Практика
Создай простой сайт:
// 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-методы в роутинге.