Питання на співбесіді рівня Junior
Найпопулярніші питання з реальних Laravel/PHP співбесід для всіх рівнів
40 питань
Фасади надають зручний статичний інтерфейс до об'єктів із Service Container.
Cache::put('key', 'value', 60);
Route::get('/', fn () => view('home'));
Попри статичний синтаксис, це не справжні статичні методи: фасад через __callStatic() дістає реальний об'єкт із контейнера й викликає метод уже на ньому. Тому фасади тестовані - їх можна мокати:
Cache::shouldReceive('get')->once()->andReturn('value');
Кожен фасад має «accessor» - рядковий ключ сервісу в контейнері.
find($id)повертає модель за первинним ключем абоnull.findOrFail($id)повертає модель або кидаєModelNotFoundException, яку Laravel автоматично перетворює на HTTP 404.
$post = Post::find($id);
if (! $post) { abort(404); } // ручна перевірка
$post = Post::findOrFail($id); // те саме одним рядком
findOrFail робить контролери чистішими. Аналогічна пара для запитів - first() / firstOrFail().
Докладніше в документації: Eloquent: не знайдено / findOrFail
Це «upsert»-методи, що позбавляють від ручних перевірок «існує / не існує».
// знайти за email; якщо нема - створити з усіма атрибутами
User::firstOrCreate(
['email' => $email],
['name' => $name]
);
// знайти за email; оновити name; якщо нема - створити
User::updateOrCreate(
['email' => $email],
['name' => $name]
);
Перший масив - умови пошуку, другий - значення для створення/оновлення. Споріднений firstOrNew() повертає незбережений екземпляр.
Базовий layout оголошує «дірки» через @yield, дочірні шаблони їх заповнюють:
{{-- layouts/app.blade.php --}}
<html><body>
<main>@yield('content')</main>
</body></html>
{{-- posts/show.blade.php --}}
@extends('layouts.app')
@section('content')
<h1>{{ $post->title }}</h1>
@endsection
Навіщо: загальна розмітка (шапка, футер, підключення ассетів) описується один раз. Альтернатива - Blade-компоненти (<x-layout> зі слотами), які в нових проєктах часто витісняють @extends.
Blade-компоненти - багаторазові елементи UI, які підключаються тегом:
<x-alert type="error" :message="$error" />
Бувають:
- Анонімні - лише файл
resources/views/components/alert.blade.php. - Класові -
php artisan make:component Alert, з PHP-класом для логіки.
Дані передаються атрибутами, контент - через слоти:
{{-- components/card.blade.php --}}
<div class="card">
<h2>{{ $title }}</h2>
{{ $slot }}
</div>
Чистіше за @include, бо мають явний інтерфейс (props) та інкапсуляцію.
Іменований маршрут має псевдонім, за яким генерують 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([...])обмежують набір.
Backed enum - перелік зі скалярним значенням, прив'язаним до кожного кейса:
enum Status: string
{
case Draft = 'draft';
case Published = 'published';
}
Інтеграція з Laravel:
// каст у моделі - атрибут стає об'єктом enum
protected $casts = ['status' => Status::class];
// валідація
$request->validate(['status' => [Rule::enum(Status::class)]]);
// Route Model Binding теж резолвить enum з URL
Enum робить «магічні рядки» типобезпечними, а методи на enum (label(), color()) зручно інкапсулюють логіку відображення.
Файл приходить через $request->file(); зберігають через фасад Storage:
$request->validate([
'avatar' => ['required', 'image', 'max:2048'], // до 2 МБ
]);
$path = $request->file('avatar')->store('avatars', 'public');
// або з випадковим унікальним іменем - store() уже так робить
$user->update(['avatar_path' => $path]);
store()повертає шлях для збереження в БД.- Публічний URL -
Storage::url($path)(потребуєphp artisan storage:link). - Валідатори
image,mimes:pdf,docx,max:(в КБ) убезпечують від небажаних файлів.
Верифікація email підтверджує, що користувач справді володіє вказаною адресою. Laravel має це з коробки.
// 1. Модель реалізує контракт
class User extends Authenticatable implements MustVerifyEmail {}
// 2. Маршрути захищають middleware
Route::get('/dashboard', ...)->middleware(['auth', 'verified']);
Як працює: після реєстрації Laravel шле лист із підписаним URL (signed URL), перехід за яким ставить email_verified_at. Middleware verified не пускає непідтверджених користувачів. Подія Registered автоматично тригерить відправку листа.