Питання на співбесіді: Routing
Найпопулярніші питання з реальних Laravel/PHP співбесід для всіх рівнів
5 питань
Маршрутизація визначає, як застосунок відповідає на запити: вона прив'язує URL та HTTP-метод до конкретної дії - замикання або методу контролера.
Маршрути оголошуються у файлах директорії routes:
web.php- веб-інтерфейс із сесіями, cookie та CSRF-захистом.api.php- stateless API (без сесій, з префіксом/api).console.php- команди та розклад.
Laravel підтримує методи для кожного HTTP-дієслова - Route::get, post, put, patch, delete, а також Route::match([...]) і Route::any:
Route::get('/posts', [PostController::class, 'index']);
Route::post('/posts', [PostController::class, 'store']);
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
// Групи: спільні middleware, префікс, простір імен
Route::middleware('auth')->prefix('admin')->group(function () {
Route::get('/dashboard', [DashboardController::class, 'index']);
});
Ключові можливості:
{post}- параметр маршруту; його можна одразу резолвити в модель (Route Model Binding).->name('posts.show')- іменований маршрут для генерації URL черезroute('posts.show', $post).Route::resource(...)- одразу 7 RESTful-маршрутів для CRUD.
Переглянути всі зареєстровані маршрути: php artisan route:list.
Route Model Binding автоматично резолвить параметр маршруту в екземпляр моделі - не треба вручну робити findOrFail().
Route::get('/posts/{post}', [PostController::class, 'show']);
// $post - вже знайдена модель
public function show(Post $post)
{
return view('posts.show', compact('post'));
}
За замовчуванням пошук іде за id. Прив'язати за іншим стовпцем: {post:slug}. Якщо запис не знайдено - автоматично 404.
Іменований маршрут має псевдонім, за яким генерують URL - замість хардкоду шляху.
Route::get('/posts/{post}', [PostController::class, 'show'])->name('posts.show');
route('posts.show', $post); // у PHP
<a href="{{ route('posts.show', $post) }}">Деталі</a>
Навіщо: якщо URL зміниться (/posts → /articles), достатньо поправити маршрут - усі посилання оновляться автоматично. Також redirect()->route('posts.show', $post).
Route::resource() одним рядком реєструє 7 маршрутів за RESTful-конвенцією:
Route::resource('posts', PostController::class);
| Метод | URL | Дія |
|---|---|---|
| GET | /posts | index |
| GET | /posts/create | create |
| POST | /posts | store |
| GET | /posts/{post} | show |
| GET | /posts/{post}/edit | edit |
| PUT/PATCH | /posts/{post} | update |
| DELETE | /posts/{post} | destroy |
apiResource()- те саме безcreate/edit(для API).->only([...])/->except([...])обмежують набір.
Rate Limiting обмежує кількість запитів за період. Іменовані обмежувачі визначають через RateLimiter::for() (у Laravel 11+ зазвичай у bootstrap/app.php або AppServiceProvider::boot()):
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
Застосування до маршрутів:
Route::middleware('throttle:api')->group(...);
Route::post('/login', ...)->middleware('throttle:5,1'); // 5 за хвилину
При перевищенні - HTTP 429 із заголовками Retry-After та X-RateLimit-*.