Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама

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-*.

Докладніше в документації: Rate Limiting

Група задає спільні налаштування для кількох маршрутів, щоб не повторювати їх у кожному.

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.

Два способи виправити:

  1. Статичні маршрути - вище за параметризовані.
  2. Обмежити параметр, щоб він не ловив чуже:
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} саме з цієї причини. Проблема виникає, коли маршрути додають вручну в різних місцях файлу.

Докладніше в документації: Обмеження параметрів регулярними виразами