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

Senior: питання на співбесіді з теми «Маршрутизація»

Питання з реальних співбесід з відповідями: Laravel і PHP, бази даних, JavaScript і фронтенд, Git, Docker, API, безпека й архітектура. Тими самими темами, що й тести.

2 питання

php artisan route:cache компілює всі маршрути в один PHP-файл у bootstrap/cache. Laravel більше не виконує routes/*.php на кожен запит, і реєстрація маршрутів стає майже миттєвою - на застосунках із сотнями маршрутів це помітно.

Коли він ламається чи заважає:

  • Маршрути не оновлюються. Після кешування нові маршрути не з'являються, доки кеш не перебудувати. Тому route:cache (чи optimize) виконують на кожному деплої, а локально не вмикають.
  • Маршрути, що залежать від стану під час реєстрації. Якщо в routes/web.php маршрути генеруються з бази чи з конфігурації, яка змінюється без деплою, кеш «заморозить» їх на момент збирання.
  • Конфлікт імен. Два маршрути з однаковим ім'ям без кешу мовчки перезаписують одне одного, а при кешуванні команда падає з помилкою - це навіть корисно.

Маршрути на замиканнях у сучасних версіях кешуються (їх серіалізують), але звичайна практика - контролери: їх легше тестувати й шукати.

Діагностика: php artisan route:list показує маршрути з кешу, якщо він є; route:clear прибирає кеш.

Докладніше в документації: Кешування маршрутів

Неявна прив'язка за замовчуванням шукає модель за первинним ключем. Є кілька рівнів налаштування - від простого до повного контролю.

Інша колонка для одного маршруту:

Route::get('/posts/{post:slug}', [PostController::class, 'show']);

Інша колонка для моделі завжди:

public function getRouteKeyName(): string
{
    return 'slug';
}

Власна логіка - наприклад, лише опубліковані пости для гостей:

public function resolveRouteBinding($value, $field = null): ?Model
{
    return $this->where($field ?? $this->getRouteKeyName(), $value)
        ->when(! auth()->user()?->isEditor(), fn ($q) => $q->published())
        ->first();
}

null дає 404.

Явна прив'язка в провайдері - коли параметр не відповідає моделі напряму:

Route::bind('user', fn (string $value) => User::where('name', $value)->firstOrFail());

Поряд корисне:

  • ->withTrashed() на маршруті - знаходити м'яко видалені моделі;
  • ->missing(fn () => redirect(...)) - що робити замість 404;
  • scopeBindings() - вкладена модель шукається через батьківську, і чужий ID не пройде.

Важливо: прив'язка моделі - це пошук, а не авторизація. Перевірку прав робить політика.

Докладніше в документації: Налаштування логіки розв'язання