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 не пройде.
Важливо: прив'язка моделі - це пошук, а не авторизація. Перевірку прав робить політика.