Middle: питання на співбесіді з теми «Маршрутизація»
Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.
3 питання
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-*.
Група задає спільні налаштування для кількох маршрутів, щоб не повторювати їх у кожному.
Route::middleware(['auth', 'verified'])
->prefix('dashboard')
->name('dashboard.')
->controller(InvoiceController::class)
->group(function () {
Route::get('/invoices', 'index')->name('invoices.index'); // /dashboard/invoices
Route::get('/invoices/{invoice}', 'show')->name('invoices.show');
});
Що можна спільно задати:
middleware()- автентифікація, верифікація, обмеження частоти;prefix()- префікс URI;name()- префікс імен маршрутів (крапку в кінці пишуть самі);controller()- спільний контролер, тоді в маршруті лише назва методу;domain()- піддомен, зокрема з параметром:{account}.example.com;scopeBindings()- вкладені моделі шукаються через батьківську.
Вкладені групи об'єднують налаштування: middleware додаються, префікси й імена склеюються.
На практиці групи - головний спосіб не забути auth для нового маршруту: він просто потрапляє в захищену групу.
Маршрути перевіряються в порядку реєстрації, і перемагає перший збіг.
Route::get('/posts/{post}', [PostController::class, 'show']);
Route::get('/posts/create', [PostController::class, 'create']); // ніколи не спрацює
Запит /posts/create збігається з першим маршрутом: create стає значенням {post}, прив'язка моделі не знаходить пост - 404.
Два способи виправити:
- Статичні маршрути - вище за параметризовані.
- Обмежити параметр, щоб він не ловив чуже:
Route::get('/posts/{post}', [PostController::class, 'show'])->whereNumber('post');
Route::get('/users/{name}', ...)->whereAlpha('name');
Route::get('/orders/{order}', ...)->whereUuid('order');
Route::get('/category/{type}', ...)->whereIn('type', ['news', 'guides']);
Глобальне обмеження для всіх маршрутів з параметром {id}:
// AppServiceProvider::boot()
Route::pattern('id', '[0-9]+');
Route::resource() реєструє create раніше за {post} саме з цієї причини. Проблема виникає, коли маршрути додають вручну в різних місцях файлу.
Докладніше в документації: Обмеження параметрів регулярними виразами