Код: Выделить всё
php artisan serveГде объявляются маршруты:
Все веб-маршруты живут в файле routes/web.php. Откройте его, там уже есть один маршрут на главную страницу. Добавим свой:
Код: Выделить всё
use Illuminate\Support\Facades\Route;
Route::get('/about', function () {
return 'Страница о проекте';
});
Параметры маршрута:
Часто URL несёт данные: id поста, slug категории. Для этого есть параметры в фигурных скобках:
Код: Выделить всё
Route::get('/posts/{id}', function (string $id) {
return 'Пост номер ' . $id;
})->whereNumber('id');
Контроллеры:
Замыкания удобны для проб, но рабочую логику принято выносить в контроллеры, иначе web.php распухнет до нечитаемого состояния. Генерируем заготовку:
Код: Выделить всё
php artisan make:controller PostController
Код: Выделить всё
namespace App\Http\Controllers;
class PostController extends Controller
{
public function index()
{
return ['posts' => ['Первый пост', 'Второй пост']];
}
public function show(string $id)
{
return 'Пост номер ' . $id;
}
}
Код: Выделить всё
use App\Http\Controllers\PostController;
Route::get('/posts', [PostController::class, 'index'])->name('posts.index');
Route::get('/posts/{id}', [PostController::class, 'show'])
->whereNumber('id')
->name('posts.show');
Полный список маршрутов приложения показывает команда
Код: Выделить всё
php artisan route:listТипичные грабли:
Порядок маршрутов. Laravel сравнивает маршруты сверху вниз и берёт первый подходящий. Если объявить /posts/{id} раньше, чем /posts/create, запрос на /posts/create попадёт в show с id равным "create". Ставьте конкретные маршруты выше шаблонных или вешайте whereNumber, он отсечёт нечисловые значения.
Ошибка "Target class [PostController] does not exist". Почти всегда это забытый use App\Http\Controllers\PostController в начале web.php.
Кеш маршрутов. На проде маршруты кешируют командой route:cache ради скорости. Две ловушки: после деплоя новых маршрутов кеш нужно пересобрать (route:clear или повторный route:cache), а маршруты-замыкания закешировать вообще нельзя, команда упадёт с ошибкой сериализации. Ещё один довод переносить логику в контроллеры.
405 Method Not Allowed. Значит URL существует, но обслуживает другой HTTP-метод: например, форма шлёт POST, а маршрут объявлен через Route::get.
Что в итоге:
Вы умеете объявлять маршруты с параметрами и ограничениями, выносить обработчики в контроллеры, давать маршрутам имена и проверять всё через route:list. В следующей главе займёмся Blade и начнём отдавать нормальные HTML-страницы вместо строк и JSON.