Маршрутизация
Введение
Маршруты приложения определяются в файлах, которые находятся в директории routes. Их автоматическая загрузка обеспечивается сервис-провайдером App\Providers\RouteServiceProvider.
- Веб-маршруты:
routes/web.php - API-маршруты:
routes/api.php - Консольные команды:
routes/console.php
Простейшая форма маршрута принимает URI и замыкание. Этот подход позволяет определять логику маршрута прямо в его объявлении, обеспечивая максимальную наглядность и читаемость:
use Imhotep\Facades\Route;
Route::get('/welcome', function () {
return "Hello World!";
});
Также маршруты могут быть связаны с контроллерами. Для этого укажите контроллер и метод, который должен быть вызван при обращении к маршруту:
use Imhotep\Facades\Route;
use App\Http\Controllers\WelcomeController;
// Вызов метода __invoke() контроллера (если он существует)
Route::get('/welcome', WelcomeController::class);
// Вызов конкретного метода контроллера
Route::get('/welcome', [WelcomeController::class, 'index']);
// Использование строкового синтаксиса (не рекомендуется, но поддерживается)
Route::get('/welcome', 'App\Http\Controllers\WelcomeController@index');
HTTP-методы
Для регистрации маршрутов, реагирующих на конкретные HTTP-методы, используйте соответствующие методы фасада Imhotep\Facades\Route:
Route::get($uri, $callback);
Route::head($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);
Обработка нескольких HTTP-методов
Если маршрут должен обрабатывать более одного HTTP-метода, но не все, используйте метод match, передавая массив нужных HTTP-методов:
// Маршрут будет отвечать на GET и POST запросы
Route::match(['get', 'post'], $uri, $callback);
Для регистрации маршрута, который должен отвечать на любой HTTP-метод, используйте метод any:
Route::any($uri, $callback);
Важное замечание о порядке определения
Маршруты, использующие методы get, post, put, patch, delete, options, match, должны быть определены до маршрутов, использующих методы any и redirect. Это правило гарантирует, что входящий запрос будет сопоставлен с наиболее конкретным маршрутом, а не с более общим.
Почему это важно: Представьте, что маршрут
Route::any('/api')определен первым. Он будет перехватывать все запросы к/api(GET, POST и т.д.), даже если ниже определен более специфичный маршрутRoute::post('/api/data').
Переадресация
Методы redirect() и permanentRedirect() фасада Route позволяют создать маршрут, который автоматически перенаправляет запрос с одного URI на другой:
// Простая переадресация со статусом 302 (Found)
Route::redirect('/from', '/to');
// Постоянное перенаправление (301 Moved Permanently)
Route::redirect('/from', '/to', 301);
// Эквивалентно Route::redirect('/old', '/new', 301)
Route::permanentRedirect('/old', '/new');
Маршруты для отображения шаблонов
Если маршрут должен просто отображать HTML-шаблон без выполнения дополнительной бизнес-логики, используйте метод Route::view(). Этот метод создаёт специальный маршрут, который сразу возвращает указанный шаблон.
// Отображение шаблона без передачи данных
Route::view('/welcome', 'welcome');
// Отображение шаблона с передачей данных
Route::view('/welcome', 'welcome', ['name' => 'value']);
// Отображение шаблона с передачей данных и кода состояния 250
Route::view('/welcome', 'welcome', ['name' => 'value'], 250);
// Отображение шаблона с передачей данных, кода состояния и заголовков
Route::view('/welcome', 'welcome', ['name' => 'value'], 250, ['header' => 'value']);
// Отображение шаблона с передачей данных, заголовков, без кода состояния
Route::view('/welcome', 'welcome', ['name' => 'value'], ['header' => 'value']);
При использовании uri-параметров, следующие названия зарезервированы Imhotep и не могут быть использованы:
view,data,statusиheaders.
Обработка несуществующих маршрутов
Метод Route::fallback() позволяет задать обработчик для запросов, которые не соответствуют ни одному из ранее объявленных маршрутов. Если обработчик не задан, будет автоматически выдана 404 ошибка.
// Пользовательская страница 404
Route::fallback(fn() => response()->view('errors.404', [], 404) );
// Перенаправление на главную страницу
Route::fallback(fn() => redirect('/') );
Доступ к текущему маршруту
Методы current() и currentRouteName() фасада Route позволяют получить информацию о маршруте, обрабатывающем текущий запрос:
use Imhotep\Facades\Route;
// Получить текущий экземпляр маршрута
$route = Route::current();
// Получить только имя текущего маршрута
$name = Route::currentRouteName();
Просмотр списка маршрутов
Чтобы увидеть все зарегистрированные в приложении маршруты, используйте консольную команду route:list. Эта команда выводит удобную таблицу с URI, методами, действиями и именами маршрутов.
php imhotep route:list
Кэширование маршрутов
В production-среде настоятельно рекомендуется использовать кэширование маршрутов. Это значительно сокращает время регистрации маршрутов при каждом запросе.
Создание/обновление кэша маршрутов:
php imhotep route:cache
Очистка кэша маршрутов:
php imhotep route:clear
Важно: Всегда очищайте кэш в среде разработки перед внесением изменений в маршруты. В production среде выполняйте
route:cacheтолько после развертывания финальной версии кода.