Read in other languages: English 🇺🇸, Polska 🇵🇱, German 🇩🇪, French 🇫🇷, Spanish 🇪🇸, Українська 🇺🇦.
1. Що таке Laravel і чому його використовують?
Laravel — це сучасний PHP-фреймворк для веброзробки, орієнтований на продуктивність розробника, чисту архітектуру та підтримуваний код.
- Що таке Laravel
- Відкритий фреймворк, побудований на компонентах Symfony.
- Достатньо opinionated, щоб давати сильні стандартні рішення, але водночас гнучкий для кастомної архітектури.
- Чому його використовують
- Прискорює розробку завдяки вбудованим механізмам маршрутизації, валідації, автентифікації, черг, пошти, подій і кешування.
- Сприяє чистому коду через сервісний контейнер, middleware, Eloquent ORM та інструменти тестування.
- Надає офіційні інструменти (
Artisan, міграції, планувальник, Horizon, Telescope) для production-ready застосунків.
- Типові сценарії використання
- REST API та бекенд-сервіси.
- Серверно-рендерені вебзастосунки.
- Адмінпанелі, SaaS-продукти та маркетплейси.
- Фонова обробка задач і інтеграції зі сторонніми сервісами.
Коротко: Laravel використовують, щоб швидше будувати безпечні, масштабовані й підтримувані PHP-застосунки з меншим обсягом шаблонного коду.
2. Що таке Composer autoloading і як працює PSR-4?
Composer autoloading — це механізм автоматичного завантаження класів без ручних require/include, а PSR-4 — стандарт мапінгу namespace до файлової структури.
- Роль Composer autoload
- Генерує автозавантажувач на основі конфігурації пакетів/застосунку.
- Підключається один раз і підвантажує класи за потреби.
- Принцип PSR-4
- Namespace-префікс мапиться на базову директорію.
- Сегменти namespace відповідають піддиректоріям.
- Ім’я класу відповідає імені файла.
- Приклад
App\\->app/App\\Services\\BillingService->app/Services/BillingService.php
- Чому це важливо
- Передбачувана структура коду.
- Менше ручного bootstrap-боїлерплейту.
- Краща сумісність із екосистемою пакетів.
Composer + PSR-4 — фундамент сучасної організації PHP/Laravel-кодової бази.
3. Що таке spread/splat оператор у PHP?
Оператор ... у PHP використовується для розпакування аргументів/масивів і для variadic-параметрів.
- Argument unpacking
$args = [2, 3];
$result = sum(...$args);- Array unpacking
$a = [1, 2];
$b = [...$a, 3, 4];- Variadic capture
function logAll(string ...$messages): void {}... робить функціональний і композиційний код коротшим і читабельнішим.
4. Що таке enums у PHP 8.1+?
Enums — це нативні типи для моделювання обмеженої множини станів/значень.
- Види
- Unit enums (без скалярного значення).
- Backed enums (із
stringабоintзначенням).
- Приклад
enum OrderStatus: string
{
case Draft = 'draft';
case Paid = 'paid';
case Shipped = 'shipped';
}- Навіщо
- Сильніші контракти.
- Менше “магічних рядків”.
- Краща type safety і static analysis.
Enums — рекомендований підхід для finite-state моделей у сучасному PHP.
5. Що таке readonly properties у PHP?
readonly властивість можна присвоїти лише один раз (зазвичай у конструкторі).
- Поведінка
- Після ініціалізації змінювати значення заборонено.
- Приклад
final class UserDto
{
public function __construct(
public readonly int $id,
public readonly string $email,
) {}
}- Переваги
- Менше випадкових мутацій.
- Простіше підтримувати immutable-об’єкти.
Readonly properties підвищують передбачуваність об’єктного стану.
6. Що таке readonly classes у PHP 8.2+?
readonly class робить усі instance-властивості класу readonly за замовчуванням.
- Що це дає
- Політика незмінності на рівні всього класу.
- Менше boilerplate, ніж ставити
readonlyна кожне поле окремо.
- Приклад
readonly class Money
{
public function __construct(
public int $amount,
public string $currency,
) {}
}Readonly classes добре підходять для value objects і DTO з immutable-семантикою.
7. Що таке PHP generators і коли їх варто використовувати?
Generators — це функції з yield, які повертають значення ліниво, по одному, без створення великого масиву в пам’яті.
- Що вирішують
- Значно зменшують споживання пам’яті при обробці великих наборів даних.
- Коли використовувати
- Потокова обробка файлів.
- Ітерація великих вибірок із БД.
- Пайплайни, де не потрібна повна матеріалізація всіх даних.
- Приклад
function numbers(int $max): Generator
{
for ($i = 1; $i <= $max; $i++) {
yield $i;
}
}Generators доречні там, де важлива memory-efficiency і послідовна обробка даних.
8. Що таке Laravel Sail?
Laravel Sail — це офіційне легковагове Docker-оточення для локальної розробки Laravel.
- Що дає Sail
- Готові контейнери для PHP, БД, Redis та супутніх сервісів.
- Узгоджене локальне середовище для всієї команди.
- Чому його використовують
- Швидкий онбординг нових розробників.
- Менше “працює тільки в мене” проблем.
- Не треба вручну збирати локальний стек.
- Практична користь
- Команди запуску, тестування й сервісних операцій виконуються через єдиний Docker-based workflow.
Sail — практичний дефолт для контейнеризованої локальної розробки на Laravel.
9. Що таке Form Requests?
Form Requests — це окремі request-класи, які інкапсулюють валідацію та авторизацію для конкретного HTTP-запиту.
- Що містять
authorize()для перевірки права на дію.rules()для правил валідації.
- Як використовуються
- Type-hint у controller action; Laravel автоматично виконує перевірки до бізнес-логіки.
public function store(StoreOrderRequest $request): JsonResponse
{
$data = $request->validated();
// ...
}- Переваги
- Тонші контролери.
- Централізована й повторно використовувана валідація.
- Простіше тестування request-рівня.
Form Requests — канонічний Laravel-підхід до валідації вхідних даних на межі API/web.
10. Як створювати REST API у Laravel?
Створення REST API у Laravel базується на ресурсних маршрутах, валідації, авторизації та стабільному JSON-контракті.
- Використовуйте
routes/api.phpіRoute::apiResource(...). - Тримайте контролери тонкими, бізнес-логіку виносьте в сервіси/actions.
- Валідуйте вхідні дані через Form Requests.
- Формуйте відповіді через API Resources.
- Захищайте API через Sanctum/Passport, middleware, policies і rate limiting.
Добрий REST API в Laravel — це насамперед узгодженість контрактів і передбачувана поведінка.
11. Як працює concurrency у чергах?
Concurrency у чергах досягається запуском кількох workers паралельно, щоб обробляти багато jobs одночасно.
- Модель
- Кожен worker обробляє jobs незалежно.
- Більше workers = вищий паралельний throughput.
- Керування
- Кількість worker-процесів.
- Розділення за пріоритетними чергами.
- Налаштування timeout/retry/memory.
- Вимоги до коректності
- Jobs мають бути ідемпотентними.
- Для спільних ресурсів потрібні блокування/атомарні операції.
Concurrency підвищує пропускну здатність, але вимагає правильної моделі консистентності.
12. Що таке ідемпотентність у queued jobs?
Ідемпотентність означає: повторний запуск тієї самої job не змінює фінальний результат порівняно з одноразовим виконанням.
- Чому це критично
- Jobs можуть ретраїтися.
- Можливі дублікати dispatch.
- Як реалізувати
- Унікальні бізнес-ключі/idempotency keys.
- Перевірка стану перед побічною дією.
- DB-обмеження або атомарні операції.
- Приклад
- “Надіслати інвойс лише один раз на invoice ID”.
Ідемпотентність — ключ до надійних retry-safe асинхронних процесів.
13. Як працює кешування в Laravel?
Laravel cache зберігає попередньо обчислені дані у швидкому сховищі, щоб зменшити повторні дорогі обчислення.
- Патерн
- Читаємо з кешу.
- За відсутності — обчислюємо і зберігаємо з TTL.
- API
get,put,remember,rememberForever,forget.
- Приклад
$users = Cache::remember('users.active', 300, fn () => User::where('is_active', true)->get());Кеш знижує latency й навантаження на БД.
14. Які cache drivers доступні?
Поширені cache drivers у Laravel:
arrayfiledatabaseredismemcacheddynamodb(за конфігурації)null
Для high-load сценаріїв зазвичай обирають Redis або Memcached.
15. Які cache-стратегії варто використовувати у high-load Laravel-застосунку?
- Cache-aside (
remember) для дорогих запитів. - Захист від cache stampede через locks/jitter.
- Точкове invalidation (за можливості tags).
- Кешування компактних payload замість важких об’єктів.
- Постійний моніторинг hit rate/latency.
У high-load найважливіші не лише швидкі кеші, а й правильна invalidation-стратегія.
16. Що таке cache tags?
Cache tags дозволяють групувати ключі й очищати їх разом.
- Навіщо
- Точкове очищення пов’язаних кешів без глобального flush.
- Приклад
Cache::tags(['users', 'team:42'])->put('users.team.42.list', $data, 600);
Cache::tags(['users', 'team:42'])->flush();Працює не на всіх драйверах (типово Redis/Memcached).
17. Як очищати та прогрівати кеш?
- Очищення
php artisan cache:clear
php artisan config:clear
php artisan route:clear
php artisan view:clear- Побудова кешів
php artisan config:cache
php artisan route:cache
php artisan view:cache- Warm-up
- Після деплою наперед заповнюйте “гарячі” ключі для зменшення cold-start.
18. Що таке Laravel Octane?
Laravel Octane запускає Laravel на long-lived workers (Swoole або RoadRunner) замість повного bootstrap на кожен запит.
Це дає вищий throughput і нижчу latency для відповідних навантажень.
19. Як Laravel Octane покращує продуктивність?
- Менше перезапусків framework bootstrap.
- Більше запитів на один worker-процес.
- Краща ефективність під сталим навантаженням.
Важливо писати Octane-safe код (без витоків mutable state між запитами).
20. Що таке Swoole і RoadRunner?
Swoole і RoadRunner — high-performance application servers для Octane.
- Swoole: PHP-розширення з async/coroutines.
- RoadRunner: Go-based сервер із persistent PHP workers.
Обидва зменшують overhead класичного request-per-process підходу.
21. Які проблеми можуть виникати через state persistence в Octane?
Оскільки workers довгоживучі, помилки керування станом можуть “протікати” між запитами.
- Stale singleton/static state.
- Випадкове збереження request/user контексту.
- Memory growth і нестабільність worker-ів.
Потрібні stateless-підходи, скидання контексту й моніторинг пам’яті.
22. Як оптимізувати Laravel-застосунок для production?
- Увімкнути framework caches (
config,route,view). - Налаштувати OPcache.
- Виносити важкі задачі в queues.
- Оптимізувати БД (N+1, індекси,
EXPLAIN). - Використовувати Redis/Memcached кеш.
- Налаштувати моніторинг і алерти.
- Використовувати безпечний zero-downtime deployment flow.
Production-оптимізація — безперервний цикл “виміряти → покращити → перевірити”.
23. Що таке task scheduling у Laravel?
Task scheduling у Laravel — це кодо-орієнтований шар керування регулярними задачами (cron orchestration).
- Базова ідея
- Розклад визначається в коді застосунку.
- Системний cron запускає Laravel scheduler щохвилини.
- Типові сценарії
- Періодичні синхронізації даних.
- Очистка службових даних.
- Генерація звітів.
- Розсилки за розкладом.
- Переваги
- Централізовані, версійовані правила запуску.
- Менше ручного адміністрування великої кількості cron-записів на сервері.
- Підтримка overlap-захисту, environment-умов і гнучкої частоти.
- Операційний принцип
- Налаштовується один cron-запис для
schedule:run. - Laravel сам визначає, які задачі мають запуститися в поточну хвилину.
Task scheduling робить регулярну автоматизацію в Laravel передбачуваною й підтримуваною.
24. Що таке Laravel Broadcasting?
Laravel Broadcasting — це realtime-шар Laravel для доставки server-side подій клієнтам через WebSockets (або сумісні драйвери).
- Що він робить
- Транслює вибрані події Laravel у канали.
- Дозволяє клієнтам підписуватися й реагувати миттєво.
- Типові сценарії
- Живі сповіщення.
- Чати та індикатори присутності.
- Realtime-дашборди й оновлення статусів.
- Ключові поняття
- Канали:
public,private,presence. - Авторизація для private/presence каналів.
- Event-класи з broadcasting-поведінкою.
- Загальна схема
- Backend dispatch-ить broadcast event.
- Broadcast driver відправляє подію у websocket-інфраструктуру.
- Frontend (зазвичай Laravel Echo) слухає подію та оновлює UI.
Broadcasting дозволяє будувати реактивний UX без надмірного polling.
25. Що таке job batching?
Job batching об’єднує багато jobs в один керований пакет із загальним життєвим циклом.
- Що це дає
- Dispatch багатьох jobs як одного логічного процесу.
- Відстеження прогресу, завершення та помилок.
- Callback-и на етапах
then,catch,finally.
- Типовий сценарій
- Імпорт великого файлу, розбитий на багато jobs по чанках.
- Де корисно
- Масові імпорт/експорт процеси.
- Переіндексація.
- Fan-out завдання, де важливий загальний статус.
- Практична користь
- Краще спостереження за multi-job workflow.
- Простіше керування в адмінці (моніторинг/скасування).
Batching доречний, коли багато паралельних jobs належать одному бізнес-процесу.
26. Як працюють signed URLs у Laravel?
Signed URL містить криптографічний підпис, що підтверджує: посилання сформоване вашим застосунком і не було змінене.
- Що захищається
- Цілісність path і query parameters.
- За потреби — строк дії (тимчасові посилання).
- Як згенерувати
$url = URL::signedRoute('unsubscribe', ['user' => $user->id]);
$temporary = URL::temporarySignedRoute('download', now()->addMinutes(30), ['file' => $fileId]);- Як перевірити
- Використайте middleware
signedна маршруті або відповідну перевірку в запиті.
Route::get('/unsubscribe/{user}', UnsubscribeController::class)
->name('unsubscribe')
->middleware('signed');- Типові сценарії
- Unsubscribe links.
- Email verification дії.
- Тимчасові download/action посилання.
Signed URLs дають простий спосіб безпечно відкривати публічні дії без обов’язкової сесійної автентифікації.
27. Як Laravel захищає від XSS-атак?
Laravel запобігає XSS переважно через безпечний рендеринг і escaping за замовчуванням.
- Blade екранує вивід автоматично
{{ $value }}HTML-escape-иться за замовчуванням.- Це не дозволяє недовіреному HTML/JS виконатися в браузері.
- Обережно з raw output
{!! $value !!}рендерить без escaping.- Використовуйте лише для довіреного або попередньо санітайзеного контенту.
- Додаткові захисні шари
- Валідація й нормалізація вводу.
- CSP та інші security headers (через middleware/server config).
- API/frontend-практика
- JSON-відповіді зазвичай безпечніші за вставку сирого HTML.
- На client-side також потрібно екранувати недовірені дані.
- Практичне правило
- Escape by default, sanitize when needed, minimize raw rendering paths.
Laravel дає сильні дефолти, але фінальна безпека залежить від дисципліни виводу в прикладному коді.
28. Як Laravel захищає від SQL Injection?
Laravel знижує ризик SQL Injection завдяки parameter binding і безпечним query-абстракціям за замовчуванням.
- Prepared statements і bindings
- Query Builder та Eloquent використовують bind-параметри замість конкатенації SQL-рядків.
- Безпечні приклади
User::where('email', $email)->first();
DB::table('orders')->where('status', $status)->get();- Де лишається ризик
- Ручна конкатенація в raw SQL із недовіреним вводом.
// небезпечно, якщо $input недовірений
DB::select("SELECT * FROM users WHERE email = '$input'");- Безпечний raw SQL
- Використовуйте placeholders і bindings:
DB::select('SELECT * FROM users WHERE email = ?', [$input]);- Best practices
- Віддавайте перевагу Eloquent/Query Builder.
- Валідуйте вхідні дані.
- Мінімізуйте ручне складання SQL із зовнішніх параметрів.
Laravel безпечний за замовчуванням, але некоректне використання raw SQL може повернути injection-ризики.
29. Коли обирати Sanctum замість Passport?
Sanctum доцільно обирати тоді, коли потрібна проста first-party автентифікація без повного OAuth2-стека.
- Коли Sanctum підходить найкраще
- SPA + Laravel backend із session/cookie auth.
- Mobile або внутрішні клієнти з personal access tokens.
- Невеликі/середні API, де не потрібна OAuth2 delegation.
- Чому саме Sanctum
- Швидше впровадження.
- Менша операційна складність.
- Менше рухомих частин у керуванні токенами.
- Коли його недостатньо
- Потрібна делегована авторизація для сторонніх застосунків.
- Потрібні повні OAuth2 grant-flow і стандартизований auth-server рівень.
- Практичне правило
- За замовчуванням для first-party продуктів — Sanctum.
- Переходьте на Passport, коли OAuth2-вимоги чітко сформульовані.
Sanctum — прагматичний дефолт для більшості Laravel API у продуктовій розробці.
30. Порівняйте Laravel Sanctum і Laravel Passport.
Sanctum і Passport обидва надають API-автентифікацію, але орієнтовані на різну складність задач.
- Sanctum
- Легковагова token-auth + SPA session-auth.
- Personal access tokens і прості abilities.
- Швидший старт і менше OAuth2-складності.
- Passport
- Повноцінний OAuth2 server.
- Підтримує authorization code, client credentials, refresh tokens, scopes та інші OAuth2-механізми.
- Краще підходить для third-party delegated authorization.
- Компроміс
- Sanctum: простіше впровадити і підтримувати для first-party застосунків.
- Passport: потужніше, але важче в налаштуванні та операційному супроводі.
- Типовий вибір
- Sanctum: SPA/mobile + власний backend.
- Passport: платформи з зовнішніми OAuth-клієнтами та складними auth-сценаріями.
Обирайте за реальними протокольними вимогами, а не за “універсальністю” пакета.
31. Що таке multi-authentication і як його реалізувати?
Multi-authentication — це підтримка кількох типів користувачів/guard-контекстів в одному застосунку (наприклад, web, admin, api).
- Типові сценарії
- Окремі портали для адміністраторів і клієнтів.
- Різні рівні доступу для внутрішніх і зовнішніх користувачів.
- Різні auth-стратегії для різних каналів доступу.
- Як реалізувати
- Налаштувати кілька guards/providers у auth-конфігурації.
- Використовувати middleware з конкретним guard:
auth:admin,auth:web,auth:sanctum. - За потреби мати окремі login-flow/controllers/routes для кожного guard.
- Приклад
Route::middleware('auth:admin')->group(function () {
Route::get('/admin/dashboard', AdminDashboardController::class);
});- Best practices
- Ізолюйте route-групи для кожного guard.
- Тримайте authorization-правила явними для кожного user-type.
Multi-auth дає чітке розділення ідентичностей і прав доступу в різних доменах одного застосунку.
32. Як працює автентифікація в Laravel?
Автентифікація в Laravel перевіряє особу користувача й зберігає її між запитами через guards і providers.
- Ключові складові
- Guards визначають, як користувач автентифікується (session, token тощо).
- Providers визначають, як отримуються користувачі (зазвичай Eloquent-модель).
- Session-based flow (web)
- Користувач надсилає credentials.
- Laravel валідує їх через provider.
- У разі успіху ID користувача зберігається в сесії.
- Наступні запити резолвлять користувача із session/cookie.
- Token-based flow (API)
- Клієнт надсилає токен (наприклад, Sanctum/Passport bearer token).
- Guard валідує токен і резолвить користувача.
- Корисні helper-и
Auth::attempt(),Auth::user(),auth()->check().- Middleware
authдля захисту маршрутів.
Laravel-автентифікація є guard-орієнтованою та однаково добре працює і для web, і для API.
33. У чому різниця між API Resources і Transformers?
Обидва підходи формують вихідні дані, але API Resources — це нативний стандарт Laravel, а Transformers — ширший архітектурний патерн або зовнішній шар мапінгу.
- API Resources (вбудовано в Laravel)
- Офіційний механізм Laravel (
JsonResource). - Тісна інтеграція з фреймворком і просте використання.
- Найкращий дефолт для більшості Laravel API.
- Transformers (загальний патерн / пакети)
- Архітектурний підхід для мапінгу domain-даних у response DTO.
- Може бути реалізований кастомними класами або пакетами (наприклад, Fractal-подібні підходи).
- Корисний, коли потрібен framework-agnostic або дуже кастомний transformation pipeline.
- Практична різниця
- Resource = офіційний Laravel-підхід.
- Transformer = ширший патерн, який може як використовувати Laravel-примітиви, так і бути незалежним від них.
- Що обирати
- У Laravel-first застосунках: за замовчуванням API Resources.
- Кастомний transformer-шар: коли межі домену/API вимагають додаткового відокремлення.
Обидва підходи розв’язують проблему представлення даних; вибір залежить від складності архітектури та вимог до переносимості.
34. Що таке soft deletes?
Soft deletes позначають запис як видалений, але фізично не видаляють його з таблиці.
- Як це працює
- Використовується колонка
deleted_at. - Під час видалення встановлюється
deleted_at, а рядок лишається в БД. - Дефолтні запити не повертають soft-deleted записи.
- Увімкнення в моделі
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use SoftDeletes;
}- Ключові helper-методи
withTrashed()— включити видалені записи.onlyTrashed()— тільки видалені.restore()— відновити запис.forceDelete()— видалити назавжди.
- Чому це корисно
- Можливість відновлення даних.
- Краща “аудитність” і безпечніший робочий процес при випадкових видаленнях.
Soft deletes — практичний компроміс між семантикою видалення та відновлюваністю даних.
35. Що таке database seeding?
Database seeding — це процес заповнення бази даних наперед визначеними або згенерованими даними.
- Призначення
- Підготувати застосунок до роботи з необхідними стартовими даними.
- Дати реалістичні набори даних для development/testing.
- Як запускається
- Класи сідів виконуються через Artisan.
php artisan db:seed
php artisan db:seed --class=UserSeeder- Типовий процес
DatabaseSeederоркеструє запуск інших сідів.- Factories використовуються для масового створення синтетичних записів.
- Best practices
- Критичні довідкові дані робіть детермінованими.
- У production уникайте руйнівної логіки сідів, якщо це не заплановано явно.
- Версіонуйте сіди разом із кодовою базою.
Seeding забезпечує відтворюваність середовищ і готовність системи до розробки чи тестування.
36. Як генерувати й відкочувати міграції?
Laravel надає Artisan-команди для створення міграцій і керування їх виконанням.
- Генерація міграції
php artisan make:migration create_orders_table
php artisan make:migration add_status_to_orders_table --table=orders- Запуск міграцій
php artisan migrate- Відкат останнього batch
php artisan migrate:rollback- Відкат кількох кроків
php artisan migrate:rollback --step=3- Інші корисні команди
php artisan migrate:reset(відкатити все)php artisan migrate:refresh(reset + migrate)php artisan migrate:fresh(видалити всі таблиці + migrate)
Команди rollback/refresh потрібно застосовувати обережно, особливо в production-середовищі.
37. Що таке транзакції бази даних і як їх використовувати?
Транзакція бази даних об’єднує кілька операцій в одну атомарну дію: або виконуються всі, або всі відкочуються.
- Навіщо потрібні транзакції
- Зберігають цілісність даних при пов’язаних записах.
- Запобігають частковим змінам, якщо виникла помилка.
- Використання в Laravel
DB::transaction(function () use ($orderData) {
$order = Order::create($orderData);
Inventory::reserveForOrder($order);
Payment::captureForOrder($order);
});- Ручне керування (за потреби)
DB::beginTransaction();
try {
// operations
DB::commit();
} catch (Throwable $e) {
DB::rollBack();
throw $e;
}- Best practices
- Тримайте транзакцію короткою й швидкою.
- Уникайте довгих зовнішніх HTTP-викликів усередині транзакції.
- За потреби комбінуйте з row locking для конкурентно-чутливих сценаріїв.
Транзакції критично важливі для надійних фінансових, складських і багатокрокових бізнес-процесів.
38. Як вивести raw SQL-запити в Laravel?
У Laravel є кілька способів переглянути SQL і bindings залежно від глибини дебагу.
toSql()+getBindings()
$query = User::where('email', 'like', '%@example.com%');
$sql = $query->toSql();
$bindings = $query->getBindings();toRawSql()(сучасний Laravel)
- Повертає SQL із підставленими bindings для зручнішого читання.
$sql = User::where('id', 5)->toRawSql();- Слухач запитів
DB::listen(function ($query) {
logger()->debug($query->sql, $query->bindings);
});- Інструменти
- Laravel Telescope / Debugbar можуть показувати виконані запити та їхній час.
Ці підходи варто використовувати в development/debugging, а не як постійну production-вивідну логіку.
39. Що таке chunking і коли використовувати chunk() або lazy()?
Chunking — це обробка результатів запиту невеликими пакетами, а не завантаження всього набору в пам’ять одразу.
chunk()
- Отримує записи фіксованими порціями й виконує callback для кожного chunk.
User::query()->chunk(1000, function ($users) {
foreach ($users as $user) {
// process
}
});lazy()
- Внутрішньо теж працює через порції, але назовні дає єдиний lazy-потік.
- Зручніший для pipeline-style коду.
User::query()->lazy(1000)->each(function (User $user) {
// process
});- Коли що обирати
chunk()— коли потрібна явна обробка “пакет за пакетом”.lazy()— коли потрібен гнучкий потоковий fluent-процес.
- Важлива примітка
- Якщо ви оновлюєте записи під час ітерації, віддавайте перевагу ID-орієнтованим варіантам (
chunkById,lazyById), щоб уникнути пропусків/дублів.
Chunking — базова практика для обробки великих наборів даних із контрольованим споживанням пам’яті.
40. Яке призначення методу cursor()?
cursor() повертає lazy-ітератор результатів, що дозволяє проходити записи по одному з мінімальним використанням пам’яті.
- Навіщо використовувати
- Щоб не завантажувати весь результат запиту в RAM.
- Щоб ефективно обробляти великі таблиці.
- Приклад
foreach (User::where('is_active', true)->cursor() as $user) {
// process user
}- Характеристики
- Ітерація на базі генератора.
- Добре підходить для read/process-пайплайнів.
- Ефективний у queue/long-running job сценаріях.
- Коли це не ідеально
- Якщо потрібен випадковий доступ до всіх результатів одразу.
- Якщо потрібна важка eager-завантажена графова структура для всього набору.
cursor() — ключовий інструмент масштабованої обробки записів “рядок за рядком”.
41. Що таке Lazy Collections?
Lazy Collections обробляють елементи як потік (на базі генераторів), а не завантажують усі дані в пам’ять одразу.
- Ключова властивість
- Пам’яткоефективна ітерація великих наборів даних.
- Як це працює
- Елементи генеруються та обробляються по одному.
- Ланцюжок трансформацій виконується ліниво, під час ітерації.
- Типові джерела
lazy()у запитах.cursor()в Eloquent/query builder.- Кастомні генератори, обгорнуті в
LazyCollection.
- Коли використовувати
- Скрипти міграції даних.
- Великі експорт/імпорт процеси.
- Фонові задачі з мільйонами рядків.
- Компроміс
- Частина операцій колекцій, що вимагає повної матеріалізації, менш зручна для lazy-підходу.
Lazy Collections ідеальні там, де безпека пам’яті важливіша за random access.
42. У чому різниця між масивами й колекціями?
Масиви — це нативна структура даних PHP, а колекції — об’єктні обгортки з fluent API для трансформацій.
- Масиви
- Швидка нативна структура.
- Доступ через синтаксис мови.
- Менше високорівневих інструментів трансформації “з коробки”.
- Колекції
- Об’єкти
Illuminate\Support\Collection. - Chainable-методи:
map,filter,reduce,sortBy,groupByтощо. - Виразніші й читабельніші для складних пайплайнів обробки даних.
- Приклад
$names = collect($users)
->filter(fn ($u) => $u->is_active)
->pluck('name')
->values();- Коли що використовувати
- Масиви — для простих, низькорівневих операцій.
- Колекції — для читабельності та композиційних трансформацій.
Колекції дають невеликий оверхед, але значно кращу ергономіку в прикладному коді.
43. Як згенерувати events і listeners?
Laravel надає Artisan-генератори та стандартний flow реєстрації для events/listeners.
- Згенерувати event
php artisan make:event OrderPaid- Згенерувати listener
php artisan make:listener SendOrderReceipt --event=OrderPaid- Зареєструвати зв’язок
- Зв’яжіть event і listener в event service provider або використовуйте discovery-конфігурацію фреймворку.
- Dispatch події
event(new OrderPaid($order));- Черга для listener за потреби
- Реалізуйте
ShouldQueueу listener, щоб обробка йшла асинхронно.
Генерація + явна реєстрація роблять event-workflow прозорим і підтримуваним.
44. Що таке events і listeners у Laravel?
Events і listeners реалізують publish-subscribe підхід для внутрішньої взаємодії модулів у Laravel-застосунку.
- Event
- Представляє факт того, що щось сталося в домені/застосунку.
- Приклади:
OrderPaid,UserRegistered,InvoiceOverdue.
- Listener
- Клас-обробник, який реагує на event і виконує побічну дію.
- Приклади: надіслати email, оновити CRM, поставити downstream-job.
- Чому цей підхід корисний
- Розв’язує core-flow і побічні дії.
- Підвищує модульність і підтримуваність.
- Дозволяє додавати кілька реакцій на одну подію без зміни producer-коду.
- Dispatch і обробка
- Подія dispatch-иться із сервісу/контролера.
- Фреймворк доставляє її зареєстрованим listeners.
Events описують факти, listeners реалізують реакції.
45. Що таке queued listeners?
Queued listeners — це event-listeners, які виконуються асинхронно через систему черг, а не одразу під час dispatch події.
- Чим відрізняються від звичайних listeners
- Звичайний listener виконується негайно.
- Queued listener ставиться в чергу й обробляється worker-ом.
- Як увімкнути
- Listener має реалізувати
ShouldQueue.
- Навіщо це потрібно
- Не блокувати request-cycle важкими побічними діями.
- Винести у фон email, зовнішні API-виклики, аналітику тощо.
- Best practices
- Робіть listener-логіку ідемпотентною.
- Налаштовуйте retries/timeouts відповідно до ризиків.
- Обробляйте помилки зовнішніх залежностей явно.
Queued listeners — ключовий елемент масштабованої event-обробки без деградації UX.
46. Що таке job batching?
Job batching об’єднує багато jobs в один відстежуваний пакет із спільним життєвим циклом і callback-обробкою.
- Що дає batching
- Можливість dispatch-ити багато jobs як один логічний блок.
- Відстеження прогресу, завершення та помилок.
- Callback-и на етапах
then,catch,finally.
- Приклад сценарію
- Імпорт великого файлу, розбитий на багато chunk-processing jobs в одному batch.
- Типові use case
- Імпорт/експорт даних.
- Масові reindex-операції.
- Fan-out навантаження, де важливий загальний статус виконання.
- Операційні переваги
- Краща спостережуваність і керованість multi-job workflow.
- Простіший контроль (моніторинг/скасування) через адмінські інструменти.
Batching корисний, коли багато паралельних jobs належать до одного бізнес-процесу.
47. Як обробляти failed jobs?
Laravel надає вбудовані механізми для фіксації, аналізу, повторного запуску та очищення failed jobs.
- Фіксація помилок
- Налаштуйте сховище для failed jobs (зазвичай таблиця
failed_jobs). - Винятки під час виконання переводять job у failed після вичерпання retry-ліміту.
- Retry-поведінка
- Контролюється через властивості/опції job (
tries, backoff-стратегії).
- Корисні команди
php artisan queue:failed
php artisan queue:retry all
php artisan queue:forget <id>
php artisan queue:flush- Job-рівнева обробка
- Реалізуйте метод
failed(Throwable $e)для cleanup/alert/compensation логіки.
- Best practices
- Робіть jobs ідемпотентними.
- Додавайте структуроване логування й алерти.
- Розділяйте transient і permanent failure-сценарії.
Надійна обробка failed jobs критична для стабільної асинхронної архітектури.
48. У чому різниця між queue drivers: sync, database, Redis і SQS?
Ці драйвери відрізняються моделлю виконання, продуктивністю, надійністю та операційними вимогами.
sync
- Виконує job негайно в межах поточного запиту.
- Не потребує фонового worker.
- Добре для local dev/простих сценаріїв, але не для важкої асинхронної production-нагрузки.
database
- Зберігає jobs у таблиці реляційної БД.
- Простий у старті й надійний, але зазвичай повільніший на високому throughput.
redis
- In-memory backend із високою швидкістю.
- Підходить для високого throughput і низької latency.
- Часто використовується разом із Horizon для моніторингу.
sqs
- Повністю керований queue-сервіс AWS.
- Висока масштабованість і надійність.
- Підходить для distributed/cloud-native архітектур; має хмарні затримки/вартість.
- Практичний вибір
- Малий/простий проєкт:
database. - Високонавантажений стек із Redis:
redis. - AWS-native розподілені системи:
sqs. - Локальне або примусово синхронне виконання:
sync.
Вибір драйвера має відповідати профілю навантаження та інфраструктурній стратегії.
49. Які queue drivers доступні в Laravel?
Laravel підтримує кілька backend-ів черг через конфігуровані drivers.
- Поширені вбудовані drivers
syncdatabaseredissqs(Amazon SQS)null
- Загальні характеристики
sync: виконує job одразу в поточному request-потоці.database: зберігає jobs у таблицях БД.redis: швидкий in-memory backend.sqs: керований хмарний queue-сервіс.null: ігнорує jobs (корисно для окремих local/testing сценаріїв).
- Конфігурація
- Налаштовується в
config/queue.phpта через environment variables.
Driver обирають за вимогами до надійності, throughput, інфраструктури та операційної моделі.
50. Що таке jobs і queue workers?
Jobs і workers — це базові producer-consumer компоненти асинхронної обробки в Laravel.
- Jobs
- Інкапсульовані класи задач (зазвичай у
app/Jobs). - Представляють окрему одиницю роботи для негайного або відкладеного виконання.
- Для асинхронного виконання зазвичай реалізують
ShouldQueue.
- Queue workers
- Довгоживучі процеси, які виконують jobs із черги.
- Запускаються через Artisan (
php artisan queue:work). - Підтримують параметри retries, timeout, sleep, queue selection.
- Потік виконання
- Код dispatch-ить job (
dispatch(...)). - Payload job потрапляє в обраний queue backend.
- Worker забирає job і виконує
handle().
- Операційна примітка
- У production workers зазвичай керуються process manager-ом (Supervisor/systemd).
Jobs визначають роботу, а workers безперервно виконують її у фоні.
51. Поясніть систему черг у Laravel.
Система черг Laravel виносить довгі або важкі задачі з HTTP request-cycle в асинхронну фонову обробку.
- Навіщо використовуються черги
- Швидша відповідь користувачу.
- Краща масштабованість під навантаженням.
- Надійне виконання із retry-механізмами та контролем помилок.
- Як це працює
- Застосунок dispatch-ить job у queue backend.
- Queue worker читає job із черги й виконує її.
- Невдалі jobs можна повторити або зберігати у failed storage.
- Типові задачі в черзі
- Email-розсилки, сповіщення, генерація звітів.
- Інтеграції з зовнішніми API та webhooks.
- Обробка зображень/відео, важкі імпорт/експорт операції.
- Ключові інструменти екосистеми
- Worker-команда
queue:work. - Відстеження через
failed_jobs. - Horizon (для Redis-черг) для моніторингу та керування.
Черги — критичний елемент для responsive і надійних Laravel-застосунків.
52. Що таке encrypted cookies і signed cookies?
Encrypted cookies і signed cookies обидва захищають цілісність cookie, але шифрування додатково захищає конфіденційність вмісту.
- Encrypted cookies
- Значення cookie шифрується й підписується.
- Клієнт не може прочитати або коректно змінити оригінальне значення.
- Laravel middleware може автоматично шифрувати/дешифрувати такі cookie.
- Signed cookies (орієнтація на цілісність)
- Значення може залишатися читабельним, але перевіряється підписом.
- Дозволяє виявляти підміну, але не приховує зміст.
- Дефолтна поведінка Laravel
- У типовому web-стеку Laravel зазвичай використовуються саме encrypted cookies.
- Коли що використовувати
- Encrypted cookies — для чутливих або stateful значень.
- Signed-only підхід — коли читабельність прийнятна, але потрібна перевірка цілісності.
- Security note
- Завжди встановлюйте
Secure,HttpOnlyта коректнийSameSite.
На практиці encrypted cookies найчастіше є безпечнішим дефолтним вибором для Laravel web-застосунків.
53. Як працюють signed URLs у Laravel?
Signed URL містить криптографічний підпис, який підтверджує, що посилання згенероване вашим застосунком і не було змінене.
- Що саме захищає
- Цілісність path і query parameters.
- Опційно — строк дії для time-limited посилань.
- Генерація signed URL
$url = URL::signedRoute('unsubscribe', ['user' => $user->id]);
$temporary = URL::temporarySignedRoute('download', now()->addMinutes(30), ['file' => $fileId]);- Перевірка підпису
- Використовуйте middleware
signedна маршруті або перевірку через helper запиту.
Route::get('/unsubscribe/{user}', UnsubscribeController::class)
->name('unsubscribe')
->middleware('signed');- Типові сценарії
- Unsubscribe-посилання.
- Email verification дії.
- Тимчасові download/action посилання.
Signed URL — простий спосіб захищати публічні дії без обов’язкової повної автентифікованої сесії.
54. Яких security best practices має дотримуватися кожен Laravel-застосунок?
Кожен Laravel-застосунок має поєднувати дефолтні механізми фреймворку зі строгою операційною дисципліною.
- Auth і контроль доступу
- Захищайте приватні маршрути автентифікацією.
- Використовуйте gates/policies для перевірки прав.
- Дотримуйтеся принципу найменших привілеїв.
- Безпека вводу/виводу
- Валідуйте всі вхідні дані.
- Екрануйте вивід за замовчуванням (Blade
{{ }}). - Уникайте конкатенації raw SQL; використовуйте bindings.
- Безпека сесій і cookies
- Увімкніть
HttpOnly,Secureта коректнийSameSite. - Регенеруйте сесію на login/logout.
- Секрети й конфігурація
- Захищайте
.env, ротуйте секрети, розділяйте середовища. - Ніколи не комітьте credentials у git.
- Транспорт і заголовки
- Примусово використовуйте HTTPS.
- Додавайте security headers (CSP, HSTS, X-Frame-Options тощо).
- Гігієна залежностей і платформи
- Регулярно оновлюйте Laravel/PHP/пакети.
- Моніторте вразливості й швидко встановлюйте патчі.
- Захист від зловживань
- Налаштовуйте rate limiting для auth і чутливих ендпоінтів.
- Логуйте та моніторте підозрілу активність.
- Захист даних
- Паролі лише хешуйте, чутливі зворотні дані шифруйте.
- Робіть резервні копії та перевіряйте процедури відновлення.
Безпека — це не одна фіча, а багатошарова безперервна практика в коді та операціях.
55. Що таке Gates і Policies?
Gates і Policies — це механізми авторизації в Laravel.
- Gates
- Closure-орієнтовані правила авторизації.
- Підходять для простих ability-перевірок, не прив’язаних жорстко до моделі.
- Policies
- Класовий підхід до авторизації, організований навколо моделі/ресурсу.
- Методи на кшталт
view,create,update,deleteтощо.
- Коли що використовувати
- Gates — для простих глобальних перевірок.
- Policies — для model-centric авторизації та масштабованих систем.
- Приклади використання
Gate::allows('export-reports')$this->authorize('update', $post)
Gates дають легкі перевірки, Policies — структуровану авторизацію для великих застосунків.
56. Як працюють Blade-директиви @can і @cannot?
@can і @cannot — це Blade-директиви, які умовно рендерять HTML залежно від результату авторизації.
@can
- Показує контент, якщо користувач має право на вказану дію.
@can('update', $post)
<a href="{{ route('posts.edit', $post) }}">Edit</a>
@endcan@cannot
- Показує контент, якщо користувач не має права.
@cannot('delete', $post)
<span>You cannot delete this post.</span>
@endcannot- Як вони обчислюються
- Усередині викликають логіку gate/policy.
- Працюють у контексті поточного автентифікованого користувача.
- Чому це корисно
- UI узгоджується з backend-правилами доступу.
- Користувач не бачить дій, які йому недоступні.
Ці директиви спрощують permission-aware рендеринг у Blade.
57. Що таке multi-authentication і як його реалізувати?
Multi-authentication — це підтримка кількох user-type/guard-контекстів в одному застосунку (наприклад, web, admin, api).
- Типові сценарії
- Окремі портали для адміністраторів і клієнтів.
- Доступ для співробітників і зовнішніх партнерів.
- Різні auth-стратегії для різних каналів.
- Як реалізувати
- Налаштувати кілька guards/providers у auth-конфігурації.
- Використовувати middleware з конкретним guard:
auth:admin,auth:web,auth:sanctum. - За потреби розділити login-flow/controllers/routes для кожного guard.
- Приклад захисту маршруту
Route::middleware('auth:admin')->group(function () {
Route::get('/admin/dashboard', AdminDashboardController::class);
});- Best practices
- Ізолюйте route-групи й session-flow для кожного guard.
- Явно фіксуйте authorization-правила для кожного типу користувача.
Multi-auth дає чітке розділення ідентичностей і прав доступу між доменами застосунку.
58. Порівняйте Laravel Sanctum і Laravel Passport.
Sanctum і Passport обидва вирішують API-автентифікацію, але для різного рівня складності.
- Sanctum
- Легковагова token-auth + SPA session-auth.
- Personal access tokens і прості abilities.
- Швидкий старт без OAuth2-складності.
- Passport
- Повноцінний OAuth2 server.
- Підтримує authorization code, client credentials, refresh tokens, scopes (та інші потоки).
- Краще підходить для third-party delegated authorization.
- Компроміс складності
- Sanctum: простіше й швидше для first-party застосунків.
- Passport: потужніше, але важче в налаштуванні та супроводі.
- Типовий вибір
- Sanctum: SPA/mobile + власний backend.
- Passport: platform/ecosystem API з зовнішніми OAuth-клієнтами.
Обирайте за вимогами протоколу автентифікації, а не лише за популярністю пакета.
59. Коли обирати Sanctum замість Passport?
Sanctum варто обирати, коли потрібна проста first-party автентифікація без повного OAuth2-стеку.
- Добрі сценарії для Sanctum
- SPA + Laravel backend із session/cookie auth.
- Mobile або внутрішні клієнти з personal access tokens.
- Невеликі/середні API, де OAuth2 delegation не потрібен.
- Чому саме Sanctum
- Швидша реалізація.
- Нижча операційна складність.
- Менше рухомих частин у керуванні токенами.
- Коли цього недостатньо
- Коли стороннім застосункам потрібна делегована авторизація користувача.
- Коли потрібні повні OAuth2 grant-флоу та можливості auth-server рівня стандарту.
- Практичне правило
- За замовчуванням — Sanctum для first-party продуктів.
- Переходьте на Passport, коли OAuth2-вимоги явно присутні.
Sanctum — прагматичний дефолт для більшості Laravel API-продуктів.
60. Як Laravel захищає від SQL Injection?
Laravel знижує ризик SQL Injection завдяки parameter binding і безпечним query-абстракціям “за замовчуванням”.
- Prepared statements / bindings
- Query Builder і Eloquent використовують bind-параметри замість конкатенації SQL-рядків.
- Безпечні приклади
User::where('email', $email)->first();
DB::table('orders')->where('status', $status)->get();- Де ризик лишається
- Небезпечна ручна конкатенація raw SQL.
// risk, якщо $input недовірений
DB::select("SELECT * FROM users WHERE email = '$input'");- Безпечний raw SQL
- Використовуйте placeholders і bindings:
DB::select('SELECT * FROM users WHERE email = ?', [$input]);- Best practices
- Віддавайте перевагу Eloquent/Query Builder.
- Валідуйте ввід і не будуйте SQL із недовірених значень вручну.
Laravel безпечний “із коробки”, але неправильне використання raw SQL може повернути injection-ризики.
61. Як Laravel захищає від CSRF-атак?
Laravel захищає від CSRF, вимагаючи валідний CSRF-токен для state-changing web-запитів.
- Як це працює
- Генерується session-bound токен і зберігається на сервері.
- Форма містить токен (
@csrf). - Middleware перевіряє токен на POST/PUT/PATCH/DELETE запитах.
- Використання в Blade
<form method="POST" action="/profile">
@csrf
<!-- fields -->
</form>- AJAX/SPA
- Токен можна передавати в заголовку (наприклад,
X-CSRF-TOKEN) для same-site session-flow.
- Чому це ефективно
- Зловмисник не може згенерувати коректний session-bound токен із іншого сайту.
- Важлива примітка
- CSRF головно стосується cookie/session browser-запитів, а не типових stateless bearer-token API.
CSRF middleware — базовий рівень web-безпеки в Laravel.
62. Як Laravel захищає від XSS-атак?
Laravel запобігає XSS передусім через escaping output і безпечні шаблонні дефолти.
- Blade за замовчуванням екранує
{{ $value }}автоматично HTML-escape-иться.- Це не дає недовіреному HTML/JS виконатися.
- Обережно з unescaped output
{!! $value !!}рендерить raw HTML, тому має використовуватися лише для довіреного/санітайзеного контенту.
- Додатковий захист
- Валідація та нормалізація вводу зменшують ризик потрапляння шкідливих payload.
- CSP/security headers (через middleware/server config) додають defense-in-depth.
- Frontend/API аспекти
- Повернення JSON зазвичай безпечніше, ніж рендер raw HTML-фрагментів.
- Client-side рендер теж має екранувати недовірений контент.
- Практичне правило
- Escape by default, sanitize коли HTML справді потрібен, і мінімізуйте raw-render шляхи.
Laravel дає сильні дефолти, але безпечний output-handling у прикладному коді лишається критичним.
63. Як працює шифрування в Laravel?
Laravel надає симетричне шифрування через facade Crypt із використанням ключа застосунку.
- Як це працює
- Використовується app key із environment/config.
- Дані шифруються з перевіркою цілісності для виявлення підміни.
- Розшифрування можливе лише тим самим ключем.
- Типове використання
$encrypted = Crypt::encryptString('secret-value');
$plain = Crypt::decryptString($encrypted);- Де застосовується
- Чутливі значення, що зберігаються в БД/конфігурованих payload.
- Внутрішні механізми фреймворку (наприклад, encrypted cookies, якщо увімкнено).
- Best practices
- Тримайте
APP_KEYсекретним і стабільним для кожного середовища. - Ротуйте ключі обережно, з продуманою міграційною стратегією.
- Не шифруйте те, що має бути хешованим (наприклад, паролі).
Шифрування Laravel дає простий і безпечний захист “at rest” для чутливих, але зворотно-дешифровуваних даних.
64. У чому різниця між автентифікацією та авторизацією?
Автентифікація й авторизація пов’язані, але це різні рівні безпеки.
- Автентифікація (Authentication)
- Відповідає на запитання: “Хто ви?”
- Перевіряє особу (login/session/token).
- Авторизація (Authorization)
- Відповідає на запитання: “Що вам дозволено робити?”
- Перевіряє права/ability на конкретну дію або ресурс.
- Відображення в Laravel
- Автентифікація: guards, providers,
authmiddleware. - Авторизація: gates, policies,
canmiddleware, Blade-директиви@can.
- Приклад
- Користувач може бути автентифікований (увійшов у систему), але не мати права видалити чужий пост.
Автентифікація встановлює ідентичність, авторизація застосовує правила доступу.
65. Як працює автентифікація в Laravel?
Автентифікація в Laravel перевіряє особу користувача й зберігає цю ідентичність між запитами через guards і providers.
- Ключові складові
- Guards визначають, як користувач автентифікується в запиті (session, token тощо).
- Providers визначають, як отримуються користувачі (зазвичай Eloquent-модель).
- Session-based flow (web)
- Користувач надсилає credentials.
- Laravel валідує їх через provider.
- У разі успіху ID користувача зберігається в сесії.
- У наступних запитах поточний користувач резолвиться із session/cookie.
- Token-based flow (API)
- Клієнт надсилає токен (наприклад, Sanctum/Passport bearer token).
- Guard валідує токен і резолвить автентифікованого користувача.
- Фреймворкові helper-и
Auth::attempt(),Auth::user(),auth()->check().- Middleware
authзахищає маршрути.
- Практична рекомендація
- Використовуйте вбудовані auth-скелети/пакети для типових сценаріїв.
- Тримайте auth-логіку централізовано, уникайте власної crypto/session-реалізації без потреби.
Автентифікація в Laravel guard-орієнтована й узгоджена для web та API точок входу.
66. У чому різниця між API Resources і Transformers?
Обидва підходи формують вихідні дані, але API Resources — це нативний стандарт Laravel, а Transformers — ширший архітектурний патерн або зовнішній шар мапінгу.
- API Resources (вбудовано в Laravel)
- Офіційний механізм Laravel (
JsonResource). - Тісна інтеграція з фреймворком і просте використання.
- Найкращий дефолт для більшості Laravel API.
- Transformers (загальний патерн / пакети)
- Архітектурний підхід для мапінгу domain-даних у response DTO.
- Може бути реалізований кастомними класами або пакетами (наприклад, Fractal-подібні підходи).
- Корисний, коли потрібен framework-agnostic або дуже кастомний transformation pipeline.
- Практична різниця
- Resource = офіційний Laravel-підхід.
- Transformer = ширший патерн, який може як використовувати Laravel-примітиви, так і бути незалежним від них.
- Що обирати
- У Laravel-first застосунках: за замовчуванням API Resources.
- Кастомний transformer-шар: коли межі домену/API вимагають додаткового відокремлення.
Обидва підходи розв’язують проблему представлення даних; вибір залежить від складності архітектури та вимог до переносимості.
67. Що таке API Resources у Laravel?
API Resources — це шар трансформації, який перетворює моделі/колекції на узгоджену JSON-структуру відповіді.
- Що вони роблять
- Контролюють форму вихідних даних.
- Приховують внутрішні поля.
- Передбачувано форматують і компонують пов’язані дані.
- Приклад
final class UserResource extends JsonResource
{
public function toArray($request): array
{
return [
'id' => $this->id,
'name' => $this->name,
'email' => $this->email,
];
}
}- Використання
return new UserResource($user);
return UserResource::collection($users);- Чому це важливо
- Стабільні API-контракти.
- Розділення persistence-моделі та transport-формату.
- Простіше версіонування API й контроль політики відповіді.
API Resources — нативний first-class підхід Laravel для стандартизації JSON API-відповідей.
68. Як оптимізувати Eloquent-запити для продуктивності?
Оптимізація Eloquent переважно зводиться до зменшення кількості запитів, обсягу даних і зайвої model-обробки.
- Уникайте N+1
- Використовуйте
with()/load()для relationships.
- Вибирайте лише потрібні колонки
User::query()->select('id', 'name')->get();- Робіть агрегації/перевірки існування на рівні SQL
count,sum,exists,withCountзамість завантаження повних колекцій.
- Ефективно обробляйте великі набори
- Використовуйте
chunkById,lazyById,cursorдля memory-safe ітерації.
- Індексна стратегія
- Додавайте релевантні індекси для частих фільтрів/сортувань/join.
- Кешуйте там, де доречно
- Кешуйте стабільні або дорогі результати запитів.
- Вимірюйте та профілюйте
- Використовуйте Telescope/Debugbar/query logs і
EXPLAINплани БД.
- Для складних звітних маршрутів використовуйте query builder/raw SQL
- Не кожен важкий запит зручно моделювати лише високорівневим ORM-підходом.
Оптимізація має бути measurement-driven: спершу міряйте, потім покращуйте найкритичніші місця.
69. Що таке soft deletes?
Soft deletes позначають запис як видалений, але фізично не видаляють його з таблиці.
- Як це працює
- Використовується колонка
deleted_at. - Під час видалення встановлюється
deleted_at, а рядок лишається в БД. - Дефолтні запити не повертають soft-deleted записи.
- Увімкнення в моделі
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use SoftDeletes;
}- Ключові helper-методи
withTrashed()— включити видалені записи.onlyTrashed()— тільки видалені.restore()— відновити запис.forceDelete()— видалити назавжди.
- Чому це корисно
- Можливість відновлення даних.
- Краща “аудитність” і безпечніший робочий процес при випадкових видаленнях.
Soft deletes — практичний компроміс між семантикою видалення та відновлюваністю даних.
70. Що таке database seeding?
Database seeding — це процес заповнення бази даних наперед визначеними або згенерованими даними.
- Призначення
- Підготувати застосунок до роботи з необхідними стартовими даними.
- Дати реалістичні набори даних для development/testing.
- Як запускається
- Класи сідів виконуються через Artisan.
php artisan db:seed
php artisan db:seed --class=UserSeeder- Типовий процес
DatabaseSeederоркеструє запуск інших сідів.- Factories використовуються для масового створення синтетичних записів.
- Best practices
- Критичні довідкові дані робіть детермінованими.
- У production уникайте руйнівної логіки сідів, якщо це не заплановано явно.
- Версіонуйте сіди разом із кодовою базою.
Seeding забезпечує відтворюваність середовищ і готовність системи до розробки чи тестування.
71. Як працюють factories у сучасному Laravel?
У сучасному Laravel factories є class-based і model-centric, зазвичай розміщуються в database/factories.
- Factory на основі definition
- Метод
definition()повертає дефолтні fake-атрибути.
final class UserFactory extends Factory
{
public function definition(): array
{
return [
'name' => fake()->name(),
'email' => fake()->unique()->safeEmail(),
'password' => bcrypt('password'),
];
}
}- States
- Іменовані варіанти для конкретних сценаріїв.
public function admin(): static
{
return $this->state(fn () => ['is_admin' => true]);
}- Використання
User::factory()->admin()->count(3)->create();
User::factory()->make(); // не зберігає в БД- Робота зі зв’язками
- Factories підтримують створення relations через
has(),for()та callbacks.
Factories роблять генерацію тестових/службових даних виразною, композиційною та контрольованою.
72. Що таке seeders і factories?
Seeders і factories допомагають швидко генерувати та заповнювати дані для розробки, тестів і початкового стану системи.
- Seeders
- Класи, які наповнюють БД визначеними наборами даних.
- Підходять для базових довідкових даних (ролі, права, налаштування).
- Factories
- “Шаблони” для генерації model-екземплярів із fake або кастомними даними.
- Зручні для тестів і demo/dev-даних.
- Як працюють разом
- Seeder викликає factories для швидкого створення великої кількості записів.
User::factory()->count(50)->create();- Типові сценарії
- Bootstrap локального середовища.
- Підготовка даних для автотестів.
- Наповнення staging/demo середовищ.
Seeders визначають, що вставляти, а factories визначають, як генерувати дані моделей.
73. Як генерувати й відкочувати міграції?
Laravel надає Artisan-команди для створення міграцій і керування їх виконанням.
- Генерація міграції
php artisan make:migration create_orders_table
php artisan make:migration add_status_to_orders_table --table=orders- Запуск міграцій
php artisan migrate- Відкат останнього batch
php artisan migrate:rollback- Відкат кількох кроків
php artisan migrate:rollback --step=3- Інші корисні команди
php artisan migrate:reset(відкатити все)php artisan migrate:refresh(reset + migrate)php artisan migrate:fresh(видалити всі таблиці + migrate)
Команди rollback/refresh потрібно застосовувати обережно, особливо в production-середовищі.
74. Що таке міграції і чому вони важливі?
Міграції — це version-controlled PHP-файли, які описують зміни схеми бази даних у часі.
- Що роблять міграції
- Створюють/змінюють/видаляють таблиці, колонки, індекси, constraints.
- Роблять зміни схеми відтворюваними в усіх середовищах.
- Чому це важливо
- Командна робота над схемою через code review.
- Детерміновані deploy-и й rollback-и.
- Підхід “інфраструктура як код” для еволюції БД.
- Типова структура міграції
up()застосовує зміни.down()відкочує зміни.
- Операційна цінність
- Простіший онбординг і CI-налаштування.
- Менше “works on my machine” розбіжностей схеми БД.
Міграції — основа підтримуваного життєвого циклу схеми в Laravel.
75. Що таке транзакції бази даних і як їх використовувати?
Транзакція бази даних об’єднує кілька операцій в одну атомарну дію: або виконуються всі, або всі відкочуються.
- Навіщо потрібні транзакції
- Зберігають цілісність даних при пов’язаних записах.
- Запобігають частковим змінам, якщо виникла помилка.
- Використання в Laravel
DB::transaction(function () use ($orderData) {
$order = Order::create($orderData);
Inventory::reserveForOrder($order);
Payment::captureForOrder($order);
});- Ручне керування (за потреби)
DB::beginTransaction();
try {
// operations
DB::commit();
} catch (Throwable $e) {
DB::rollBack();
throw $e;
}- Best practices
- Тримайте транзакцію короткою й швидкою.
- Уникайте довгих зовнішніх HTTP-викликів усередині транзакції.
- За потреби комбінуйте з row locking для конкурентно-чутливих сценаріїв.
Транзакції критично важливі для надійних фінансових, складських і багатокрокових бізнес-процесів.
76. Які aggregate-методи доступні в query builder?
Laravel Query Builder надає стандартні SQL-агрегації у вигляді helper-методів.
- Основні aggregate-методи
count()sum($column)avg($column)/average($column)min($column)max($column)
- Приклади
$totalUsers = DB::table('users')->count();
$totalRevenue = DB::table('orders')->sum('amount');
$avgOrder = DB::table('orders')->avg('amount');
$firstDate = DB::table('orders')->min('created_at');
$latestDate = DB::table('orders')->max('created_at');- Разом із групуванням
- Комбінуйте
selectRaw(...)+groupBy(...)для агрегацій по групах.
- Чому це корисно
- Ефективні обчислення на стороні БД.
- Не потрібно переносити зайві рядки в пам’ять застосунку.
Агрегації — базовий інструмент для дашбордів, аналітики та бізнес-метрик API.
77. Як вивести raw SQL-запити в Laravel?
У Laravel є кілька способів переглянути SQL і bindings залежно від глибини дебагу.
toSql()+getBindings()
$query = User::where('email', 'like', '%@example.com%');
$sql = $query->toSql();
$bindings = $query->getBindings();toRawSql()(сучасний Laravel)
- Повертає SQL із підставленими bindings для зручнішого читання.
$sql = User::where('id', 5)->toRawSql();- Слухач запитів
DB::listen(function ($query) {
logger()->debug($query->sql, $query->bindings);
});- Інструменти
- Laravel Telescope / Debugbar можуть показувати виконані запити та їхній час.
Ці підходи варто використовувати в development/debugging, а не як постійну production-вивідну логіку.
78. Поясніть query builder у Laravel.
Laravel Query Builder — це fluent API для побудови SQL-запитів, який працює поверх PDO і нижче рівня Eloquent-моделей.
- Що це таке
- БД-агностичний інтерфейс запитів через
DB::table(...). - Підтримує select, joins, where-умови, group, order, pagination, insert/update/delete.
- Приклад
$users = DB::table('users')
->select('id', 'name', 'email')
->where('is_active', true)
->orderByDesc('created_at')
->limit(20)
->get();- Чому його використовують
- Дає більше контролю над SQL, ніж високорівневий ORM-підхід.
- Добре підходить для звітних запитів і складних join-конструкцій.
- Зберігає безпечну роботу з параметрами через bindings.
- Eloquent vs Query Builder
- Eloquent: model-centric, багаті domain-можливості.
- Query Builder: table/query-centric, нижчий рівень і часто “легший”.
Query Builder — базовий fluent-шар для точного SQL-контролю в Laravel.
79. Що таке chunking і коли використовувати chunk() або lazy()?
Chunking — це обробка результатів запиту невеликими пакетами, а не завантаження всього набору в пам’ять одразу.
chunk()
- Отримує записи фіксованими порціями й виконує callback для кожного chunk.
User::query()->chunk(1000, function ($users) {
foreach ($users as $user) {
// process
}
});lazy()
- Внутрішньо теж працює через порції, але назовні дає єдиний lazy-потік.
- Зручніший для pipeline-style коду.
User::query()->lazy(1000)->each(function (User $user) {
// process
});- Коли що обирати
chunk()— коли потрібна явна обробка “пакет за пакетом”.lazy()— коли потрібен гнучкий потоковий fluent-процес.
- Важлива примітка
- Якщо ви оновлюєте записи під час ітерації, віддавайте перевагу ID-орієнтованим варіантам (
chunkById,lazyById), щоб уникнути пропусків/дублів.
Chunking — базова практика для обробки великих наборів даних із контрольованим споживанням пам’яті.
80. Яке призначення методу cursor()?
cursor() повертає lazy-ітератор результатів, що дозволяє проходити записи по одному з мінімальним використанням пам’яті.
- Навіщо використовувати
- Щоб не завантажувати весь результат запиту в RAM.
- Щоб ефективно обробляти великі таблиці.
- Приклад
foreach (User::where('is_active', true)->cursor() as $user) {
// process user
}- Характеристики
- Ітерація на базі генератора.
- Добре підходить для read/process-пайплайнів.
- Ефективний у queue/long-running job сценаріях.
- Коли це не ідеально
- Якщо потрібен випадковий доступ до всіх результатів одразу.
- Якщо потрібна важка eager-завантажена графова структура для всього набору.
cursor() — ключовий інструмент масштабованої обробки записів “рядок за рядком”.
81. Що таке Lazy Collections?
Lazy Collections обробляють елементи як потік (на базі генераторів), а не завантажують усі дані в пам’ять одразу.
- Ключова властивість
- Пам’яткоефективна ітерація великих наборів даних.
- Як це працює
- Елементи генеруються та обробляються по одному.
- Ланцюжок трансформацій виконується ліниво, під час ітерації.
- Типові джерела
lazy()у запитах.cursor()в Eloquent/query builder.- Кастомні генератори, обгорнуті в
LazyCollection.
- Коли використовувати
- Скрипти міграції даних.
- Великі експорт/імпорт процеси.
- Фонові задачі з мільйонами рядків.
- Компроміс
- Частина операцій колекцій, що вимагає повної матеріалізації, менш зручна для lazy-підходу.
Lazy Collections ідеальні там, де безпека пам’яті важливіша за random access.
82. У чому різниця між масивами й колекціями?
Масиви — це нативна структура даних PHP, а колекції — об’єктні обгортки з fluent API для трансформацій.
- Масиви
- Швидка нативна структура.
- Доступ через синтаксис мови.
- Менше високорівневих інструментів трансформації “з коробки”.
- Колекції
- Об’єкти
Illuminate\Support\Collection. - Chainable-методи:
map,filter,reduce,sortBy,groupByтощо. - Виразніші й читабельніші для складних пайплайнів обробки даних.
- Приклад
$names = collect($users)
->filter(fn ($u) => $u->is_active)
->pluck('name')
->values();- Коли що використовувати
- Масиви — для простих, низькорівневих операцій.
- Колекції — для читабельності та композиційних трансформацій.
Колекції дають невеликий оверхед, але значно кращу ергономіку в прикладному коді.
83. Що таке Eloquent Collections?
Eloquent Collections — це спеціалізовані колекції, які повертаються Eloquent-запитами й розширюють базову Collection можливостями, орієнтованими на моделі.
- Що це таке
- Повертаються методами на кшталт
get()та під час завантаження relationships. - Містять екземпляри моделей, а не звичайні масиви.
- Додаткові можливості
- Наслідують багатий API колекцій (
map,filter,groupBy,pluckтощо). - Додають Eloquent-специфічні helper-и:
load(),loadMissing(),modelKeys(),fresh().
- Приклад
$users = User::where('is_active', true)->get(); // Eloquent Collection
$emails = $users->pluck('email');- Чому це корисно
- Виразні post-query трансформації.
- Зручні пакетні операції над наборами моделей.
Eloquent Collections поєднують ORM-обізнаність із функціональним стилем обробки даних.
84. Які головні переваги Laravel порівняно з іншими PHP-фреймворками?
Головні переваги Laravel пов’язані з сильним developer experience, багатою вбудованою функціональністю та великим екосистемним оточенням.
- Зручність для розробника
- Послідовний і виразний дизайн API в компонентах фреймворку.
- Якісна документація та простий онбординг.
- Швидке створення каркасу застосунку й CLI-процеси через
Artisan.
- “Batteries included”
- Першокласна підтримка маршрутизації, валідації, автентифікації, черг, подій, сповіщень, кешування та планування задач.
- ORM (Eloquent) і міграції схеми доступні “з коробки”.
- Архітектура та підтримуваність
- Сервісний контейнер і dependency injection глибоко інтегровані.
- Middleware і service providers явно оформлюють наскрізні аспекти.
- Сильна підтримка тестування через інтеграцію PHPUnit/Pest.
- Сила екосистеми
- Офіційні інструменти: Forge, Vapor, Horizon, Telescope, Octane, Sanctum, Passport, Cashier.
- Зрілі community-пакети та довготривала стабільність екосистеми.
- Операційна продуктивність
- Зручні CI/CD і deployment-процеси.
- Якісна підтримка черг, кешування, Redis та моніторингу.
Laravel часто обирають тоді, коли команді потрібно швидко постачати бізнес-функціонал без втрати якості коду та довгострокової підтримуваності.
85. Як Laravel дотримується архітектури MVC?
Laravel дотримується MVC (Model-View-Controller), розділяючи доменну/дану логіку, обробку запиту та презентаційний шар.
- Model (M)
- Зазвичай це Eloquent-моделі в
app/Models. - Представляють доменні сутності та записи бази даних.
- Містять зв’язки, scope-и, casts і доменну поведінку.
- View (V)
- Blade-шаблони в
resources/views. - Відповідають лише за відображення.
- Отримують підготовлені дані з контролерів або view-моделей.
- Controller (C)
- Класи в
app/Http/Controllers. - Обробляють HTTP-запити, координують валідацію/сервіси й повертають відповіді.
- Мають залишатися “тонкими”: оркестрація, а не важка бізнес-логіка.
- Потік запиту в термінах MVC
- Route зіставляє URL з action контролера.
- Контролер використовує моделі/сервіси для виконання use case.
- Контролер повертає view (HTML) або JSON-відповідь (API).
Laravel також підтримує service-класи, actions, repositories і доменні шари поверх MVC для більших застосунків.
86. Опишіть життєвий цикл запиту в застосунку Laravel.
Життєвий цикл запиту в Laravel описує, як вхідний HTTP-запит перетворюється на HTTP-відповідь.
- Точка входу
- Вебсервер спрямовує запити в
public/index.php. - Завантажуються Composer autoloader і bootstrap Laravel-застосунку.
- Запуск HTTP kernel
- Ініціалізується сервісний контейнер.
- Готуються global і route middleware-ланцюжки.
- Service providers
- Провайдери реєструються та boot-яться.
- Стають доступними core-сервіси й прив’язки застосунку.
- Фаза маршрутизації
- Router знаходить маршрут за методом + URI.
- Виконується middleware pipeline маршруту.
- Виконання контролера/обробника
- Викликається action контролера, closure або invokable-клас.
- Залежності автоматично резолвляться з контейнера.
- Виконуються валідація, авторизація, бізнес-логіка та доступ до даних.
- Формування відповіді
- Обробник повертає
Response,JsonResponse, view, redirect або серіалізовані дані. - Laravel нормалізує результат у HTTP response object.
- Фаза завершення
- Відповідь надсилається клієнту.
- Виконуються terminable middleware і post-response хуки.
Цей цикл дає Laravel передбачувану модель виконання та чіткі точки розширення.
87. Що таке сервісний контейнер Laravel?
Сервісний контейнер Laravel — це IoC-контейнер (Inversion of Control), який відповідає за створення об’єктів і керування залежностями.
- Ключова роль
- Централізоване місце, де класи/інтерфейси прив’язуються до конкретних реалізацій.
- Автоматично резолвить залежності конструктора через reflection.
- Чому це важливо
- Зменшує ручне “зшивання” об’єктів.
- Дає dependency inversion (залежність від інтерфейсів, а не конкретних класів).
- Підвищує тестованість завдяки простій заміні реалізацій (наприклад, fakes/mocks).
- Де використовується
- Контролери, middleware, jobs, listeners, commands і service-класи.
- Внутрішні механізми фреймворку та кастомна архітектура застосунку.
- Поширені API
bind()для transient-прив’язок.singleton()для єдиного спільного екземпляра.make()/app()для резолву сервісів.
- Практичний ефект
- Чистіші конструктори, менша зв’язаність, кращий модульний дизайн.
У Laravel сервісний контейнер є однією з базових основ масштабованої архітектури застосунку.
88. Поясніть різницю між binding, singleton binding і resolving у сервісному контейнері.
Ці терміни описують різні операції в життєвому циклі контейнера Laravel.
- Binding (
bind)
- Реєструє, як контейнер має створювати тип.
- Створює новий екземпляр при кожному резолві (transient lifecycle).
$this->app->bind(PaymentGateway::class, StripeGateway::class);- Singleton binding (
singleton)
- Реєструє тип як спільний екземпляр.
- Під час першого резолву створює об’єкт, під час наступних повертає той самий.
$this->app->singleton(CacheClient::class, fn () => new CacheClient());- Resolving (
make/ auto-injection)
- Сам факт запиту до контейнера, щоб отримати екземпляр.
- Може бути явним (
app()->make(...)) або неявним через constructor injection.
$gateway = app()->make(PaymentGateway::class);- Практичне правило
- Використовуйте
bindдля stateless/легких сервісів. - Використовуйте
singletonдля спільних/важких/інфраструктурних клієнтів. - Віддавайте перевагу автоматичному resolving через dependency injection у класах, якими керує фреймворк.
89. Що таке contextual binding і коли його варто використовувати?
Contextual binding дозволяє надавати різні реалізації одного інтерфейсу залежно від того, який саме клас зараз резолвиться.
- Яку проблему вирішує
- Кілька споживачів потребують той самий контракт, але з різною конкретною поведінкою.
- Приклад сценарію
PhotoControllerмає використовуватиS3Filesystem.ReportControllerмає використовуватиLocalFilesystem.- Обидва залежать від
FilesystemInterface.
- Container API
$this->app->when(PhotoController::class)
->needs(FilesystemInterface::class)
->give(S3Filesystem::class);
$this->app->when(ReportController::class)
->needs(FilesystemInterface::class)
->give(LocalFilesystem::class);- Коли використовувати
- Multi-tenant або multi-region інтеграції.
- Різні адаптери для різних use case.
- Коли інтерфейсна архітектура потрібна, але глобальної прив’язки недостатньо.
Contextual binding корисний тоді, коли однієї глобальної прив’язки мало, і поведінка має відрізнятися залежно від контексту споживача.
90. Що таке Service Providers і яка їхня мета?
Service Providers — це центральний механізм bootstrap у Laravel для реєстрації та конфігурації сервісів застосунку.
- Основне призначення
- Реєструвати прив’язки в контейнері.
- Конфігурувати сервіси пакета/застосунку під час старту.
- Що зазвичай розміщують у них
- Прив’язки інтерфейсів до реалізацій.
- Реєстрацію singleton для інфраструктурних сервісів.
- Реєстрацію event/listener (або у спеціалізованому провайдері).
- Bootstrap пакета й wiring конфігурації.
- Типові приклади
AppServiceProviderRouteServiceProvider- Провайдери пакетів
- Чому це важливо
- Формує передбачуваний стартовий шар застосунку.
- Виносить bootstrap-логіку з контролерів/моделей.
- Підвищує модульність і підтримуваність у великих проєктах.
Service Providers — фактично composition root застосунку на Laravel.
91. У чому різниця між registering і booting у service provider?
У Service Provider методи register() і boot() виконуються на різних етапах і мають різні обов’язки.
register()
- Використовується лише для реєстрації прив’язок у контейнері.
- Має бути без побічних ефектів і не повинен залежати від того, що сервіси інших провайдерів уже boot-нулися.
public function register(): void
{
$this->app->singleton(PaymentGateway::class, StripeGateway::class);
}boot()
- Виконується після того, як усі провайдери зареєстровані.
- Використовується для дій, яким потрібні вже доступні сервіси: routes, view composers, observers, event wiring, macros.
public function boot(): void
{
Schema::defaultStringLength(191);
}- Практична відмінність
register()= оголошення залежностей.boot()= виконання логіки інтеграції з фреймворком.
Коректне розділення цих етапів запобігає помилкам порядку ініціалізації та робить старт застосунку передбачуваним.
92. Що таке Laravel Contracts?
Laravel Contracts — це визначені фреймворком PHP-інтерфейси, які описують можливості core-сервісів незалежно від їхніх реалізацій.
- Що це таке
- Інтерфейси в просторі імен
Illuminate\Contracts\.... - Приклади:
Cache\Repository,Queue\Queue,Auth\Guard,Mail\Mailer.
- Навіщо вони існують
- Розв’язують ваш код від конкретних класів фреймворку.
- Дають чистий dependency inversion і спрощують тестування.
- Дозволяють змінювати реалізації з мінімальними змінами коду.
- Як використовуються
- Type-hint контракт у конструкторі/методі.
- Дозвольте контейнеру зарезолвити поточну реалізацію.
use Illuminate\Contracts\Cache\Repository as Cache;
final class UserService
{
public function __construct(private Cache $cache) {}
}- Практична користь
- Більш підтримувана архітектура й чіткіші межі між шарами.
- Кращі mocks/fakes у тестах.
- Простіша заміна інфраструктурних деталей.
Contracts — один із ключових будівельних блоків для написання Laravel-сумісного, але implementation-agnostic коду.
93. У чому різниця між Contract і Facade?
Contracts і Facades пов’язані з сервісами Laravel, але вирішують різні задачі.
- Contract
- PHP-інтерфейс (зазвичай у
Illuminate\Contracts\...). - Описує поведінку/можливість без деталей реалізації.
- Використовується для dependency inversion і чистої архітектури.
- Facade
- “Статичний” проксі до сервісу, який резолвиться з контейнера.
- Дає короткий синтаксис для викликів фреймворк-сервісів.
- Приклад:
Cache::get('key'),Log::info('...').
- Ключова відмінність
- Contract = абстракційна межа (залежність на рівні дизайну).
- Facade = зручний шар доступу (викличний API-стиль).
- Вплив на тестування
- Contracts легко мокати через DI.
- Facades також можна мокати (
Facade::shouldReceive()), але це все ще “статично-подібний” стиль.
- Коли що обирати
- Віддавайте перевагу Contracts у domain/application сервісах.
- Використовуйте Facades у контролерах, невеликому glue-коді або фреймворк-орієнтованих ділянках, де важлива стислість.
Коротко: Contract визначає, що робить сервіс, а Facade — наскільки зручно ви його викликаєте.
94. Поясніть різницю між Facades і helper-функціями в Laravel.
І Facades, і helpers дають короткий синтаксис, але відрізняються структурою, прозорістю та підходом до тестування.
- Facades
- Класовий статичний проксі (
Cache::,DB::,Bus::). - Прив’язані до сервісів контейнера.
- Підтримують facade mocking/faking API.
- Краще IDE-discoverability через методи класу.
- Helper-функції
- Глобальні функції на кшталт
app(),route(),now(),config(),request(),response(). - Дуже короткі й зручні в шаблонах/контролерах.
- У використанні не прив’язані до імені класу.
- Ключові відмінності
- Facade: явна поверхня сервісу через клас.
- Helper: легковаговий глобальний шорткат.
- Тестування та архітектура
- У core business-коді constructor DI зазвичай чистіший, ніж обидва підходи.
- Для framework glue-коду обидва варіанти прийнятні; facades зазвичай явніші, helpers — лаконічніші.
- Практична рекомендація
- В domain-сервісах надавайте перевагу DI + contracts.
- У контролерах, jobs, views і фреймворк-інтеграціях використовуйте facades/helpers прагматично.
95. Як працює Dependency Injection у Laravel?
Dependency Injection (DI) у Laravel працює через сервісний контейнер, який автоматично резолвить залежності класів.
- Ін’єкція через конструктор
- Ви type-hint-ите залежності в конструкторі.
- Laravel резолвить і підставляє їх під час створення класу.
final class OrderController
{
public function __construct(private OrderService $service) {}
}- Ін’єкція в метод
- Працює в controller actions, handlers job-ів, listeners, commands тощо.
- Параметри з type-hint можуть резолвитися автоматично.
public function store(StoreOrderRequest $request, OrderService $service): JsonResponse
{
// ...
}- Ін’єкція інтерфейсів
- Якщо інжектите інтерфейс, прив’яжіть його до concrete-класу в provider.
$this->app->bind(PaymentGateway::class, StripeGateway::class);- Чому DI важливий
- Низька зв’язаність.
- Просте тестування з mocks/fakes.
- Явні залежності й краща підтримуваність.
У Laravel DI — це базовий спосіб чисто з’єднувати сервіси застосунку.
96. Як Laravel використовує IoC (Inversion of Control)?
Laravel застосовує IoC, передаючи створення об’єктів і зв’язування залежностей сервісному контейнеру, замість жорсткого створення залежностей усередині класів.
- Традиційний підхід (без IoC)
- Клас сам інстанціює залежності (
new StripeGateway()), що створює сильну зв’язаність.
- IoC у Laravel
- Класи оголошують потрібні абстракції (інтерфейси/типи).
- Контейнер надає конкретні реалізації.
- Де це проявляється
- Контролери, middleware, jobs, events/listeners, commands, policies, кастомні сервіси.
- Внутрішні частини фреймворку також працюють за цим принципом.
- Переваги
- Замінність реалізацій (наприклад, Stripe vs PayPal).
- Краще unit-тестування й модульна архітектура.
- Централізоване налаштування object graph у providers.
IoC у Laravel — архітектурна основа для DI, contracts і тестованості.
97. Що таке middleware у Laravel?
Middleware — це класи, які перевіряють, фільтрують або трансформують HTTP-запити/відповіді під час проходження через request pipeline.
- Призначення
- Виконувати наскрізну логіку до/після контролерної логіки.
- Типові use case
- Перевірка автентифікації/авторизації.
- Rate limiting.
- CSRF-захист.
- Логування запитів і security headers.
- Локалізація та встановлення tenant/context.
- Модель виконання
- Запит заходить у стек middleware.
- Кожен middleware або пропускає далі (
$next($request)), або зупиняє потік (повертає response/redirect/error). - Відповідь також може модифікуватися на зворотному шляху.
- Типи
- Global middleware (для всіх запитів).
- Route middleware (для конкретних маршрутів/груп).
Middleware дає змогу тримати контролери сфокусованими, виносячи повторювану HTTP-логіку в окремі pipeline-шари.
98. Як зареєструвати та призначити middleware?
У сучасному Laravel middleware зазвичай конфігуруються в bootstrap-конфігурації застосунку й призначаються через alias, group або напряму через клас.
- Реєстрація alias/group
- Визначте aliases і склад груп у конфігурації middleware на етапі bootstrap.
- Типові aliases:
auth,verified,throttleтощо.
- Global middleware
- Додаються до global-стека й виконуються для кожного запиту.
- Призначення маршрутам
- Для окремого маршруту:
Route::get('/profile', ProfileController::class)
->middleware('auth');- Для групи маршрутів:
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/dashboard', DashboardController::class);
});- Призначення через ім’я класу
- За потреби middleware можна навішувати напряму через class name, а не alias.
Практичний підхід: використовуйте aliases для читабельності та єдиного стилю в кодовій базі.
99. Як middleware працює з параметрами?
Laravel middleware може приймати параметри з route-оголошення, що дозволяє конфігурувати поведінку без дублювання middleware-класів.
- Використання в маршруті
Route::get('/admin', AdminController::class)
->middleware('role:admin');- Сигнатура middleware
public function handle(Request $request, Closure $next, string $role): Response
{
if (! $request->user() || ! $request->user()->hasRole($role)) {
abort(403);
}
return $next($request);
}- Кілька параметрів
- Передаються через кому:
middleware('throttle:60,1'). - Middleware отримує їх як додаткові аргументи після
$next.
- Коли це корисно
- Перевірки ролей/прав доступу.
- Варіанти rate limiting.
- Feature- або tenant-обмеження залежно від route-контексту.
Параметризовані middleware підвищують повторне використання й роблять намір на рівні маршрутів явним.
100. Що таке route groups, prefixes і middleware groups?
Групування маршрутів допомагає структурувати роутинґ і застосовувати спільні налаштування один раз.
- Route groups
- Об’єднують маршрути під спільними атрибутами (
middleware,prefix,name,namespaceтощо).
- Prefixes
- Додають URI-префікс до всіх маршрутів у групі.
Route::prefix('api/v1')->group(function () {
Route::get('/users', [UserController::class, 'index']);
});- Name prefixes
- Додають спільний префікс до імен маршрутів.
Route::name('admin.')->group(function () {
Route::get('/dashboard', [AdminController::class, 'dashboard'])->name('dashboard');
});
// Ім’я маршруту: admin.dashboard- Middleware groups
- Іменований набір middleware (наприклад,
web,api), який можна застосувати одним викликом. - Зменшує повторення й стандартизує поведінку для секцій маршрутів.
- Чому це важливо
- Чистіші route-файли.
- Узгоджені правила безпеки та обробки запитів.
- Простіша підтримка зі зростанням застосунку.
101. Що таке route model binding?
Route model binding автоматично перетворює параметри маршруту на екземпляри Eloquent-моделей.
- Що це робить
- Конвертує сегмент маршруту на кшталт
{user}в об’єктUser. - Якщо запис не знайдено, Laravel автоматично повертає
404.
- Приклад
Route::get('/users/{user}', [UserController::class, 'show']);
public function show(User $user): View
{
return view('users.show', compact('user'));
}- Переваги
- Прибирає повторюваний
findOrFail()boilerplate. - Підвищує читабельність і type safety.
- Дає централізований контроль над поведінкою пошуку.
- Розширене використання
- Кастомні route keys (наприклад, slug).
- Scoped/nested binding для батьківсько-дочірніх зв’язків.
Route model binding — одна з найкорисніших конвенцій Laravel для стислого й безпечного коду контролерів.
102. Поясніть implicit vs explicit route model binding.
Обидва підходи резолвлять параметри маршруту в моделі, але відрізняються стилем конфігурації.
- Implicit binding
- Laravel сам виводить прив’язку з імені параметра + type-hint.
- Мінімум налаштувань.
Route::get('/posts/{post}', fn (Post $post) => $post);- Explicit binding
- Ви вручну визначаєте, як параметр мапиться на модель.
- Корисно для кастомної логіки або нестандартного резолву.
Route::bind('post', function (string $value) {
return Post::where('slug', $value)->firstOrFail();
});- Коли що обирати
- За замовчуванням використовуйте implicit binding (чисто й конвенційно).
- Explicit binding застосовуйте для особливих правил пошуку, трансформацій або edge case.
- Пов’язане налаштування
- У багатьох випадках достатньо перевизначити
getRouteKeyName()у моделі (наприклад, для slug), без повного explicit binding.
Implicit = автоматична прив’язка за конвенцією. Explicit = ручний контроль логіки прив’язки.
103. Що таке rate limiting у Laravel і як він працює?
Rate limiting обмежує кількість запитів, які клієнт може виконати за певний проміжок часу, щоб захистити API від зловживань і перевантаження.
- Що він робить
- Обмежує частоту запитів за ключем (ID користувача, IP, токен або кастомний ідентифікатор).
- Повертає
429 Too Many Requests, якщо ліміт перевищено.
- Як Laravel це реалізує
- Використовує іменовані лімітери, визначені через
RateLimiter::for(...). - Застосовує лімітер через middleware (зазвичай
throttle). - Зберігає лічильники в cache-backend (Redis/Memcached/database cache залежно від конфігурації).
- Базовий приклад
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});- Де застосовувати
- Публічні API-ендпоінти.
- Login, OTP, reset password та інші чутливі ендпоінти.
- Дорогі операції (пошук, експорт, генерація звітів).
- Чому це важливо
- Підвищує надійність і справедливість доступу.
- Зменшує ризики brute-force атак і наслідки пікового трафіку.
104. Що таке invokable controllers?
Invokable controllers — це контролери з одним методом __invoke(), які призначені для виконання однієї конкретної дії.
- Структура
final class PublishPostController
{
public function __invoke(Post $post): JsonResponse
{
// ...
}
}- Маршрутизація
Route::post('/posts/{post}/publish', PublishPostController::class);- Переваги
- Дуже сфокусована відповідальність.
- Чистіше зіставлення route-to-action.
- Добре поєднується з action-орієнтованою архітектурою.
- Коли корисно
- Ендпоінти з чіткою єдиною метою.
- CQRS/action-based стиль.
- Великі кодові бази, де менші класи покращують навігацію.
Invokable controllers — практичний спосіб тримати HTTP-шар явним і модульним.
105. Що таке Single Action Controllers?
Single Action Controllers — це той самий підхід, що й invokable controllers: один клас контролера обробляє одну дію через метод __invoke().
- Ключова ідея
- Один клас = один use case.
- Без набору методів
index/store/updateв одному контролері.
- Чому команди це використовують
- Краще розділення відповідальностей.
- Простішe тестування кожного ендпоінта.
- Менше merge-конфліктів у великих командах.
- Приклади use case
ApproveInvoiceControllerSendWelcomeEmailControllerGenerateReportController
- Компроміс
- Більше файлів/класів.
- Але зазвичай краща довгострокова підтримуваність для середніх і великих проєктів.
Single Action Controllers — це передусім архітектурний стиль, який ставить акцент на ясність і масштабованість.
106. У чому різниця між Resource Controllers і API Resource Controllers?
Різниця переважно в наборі згенерованих action-ів і в цільовому форматі відповіді.
- Resource Controller (
Route::resource)
- Генерує повний web CRUD-набір маршрутів:
index,create,store,show,edit,update,destroy. - Містить маршрути
createіedit, зазвичай для HTML-форм/сторінок.
- API Resource Controller (
Route::apiResource)
- Генерує API-орієнтований CRUD-набір:
index,store,show,update,destroy. - Не містить
createіedit(UI-сторінки форм для API зазвичай не потрібні).
- Типове використання
resource: server-rendered вебзастосунки.apiResource: JSON API, mobile backend, SPA backend.
- Пов’язаний концепт
- API-відповіді часто формуються через
JsonResourceдля узгодженого контракту даних.
107. Як створювати кастомні Artisan-команди?
Кастомні Artisan-команди — це CLI-класи для автоматизації, обслуговування, імпортів і операційних процесів.
- Згенеруйте клас команди
php artisan make:command SyncInvoicesCommand- Визначте signature і description
protected $signature = 'billing:sync {--dry-run}';
protected $description = 'Sync invoices from billing provider';- Реалізуйте логіку в
handle()
public function handle(): int
{
// command logic
return self::SUCCESS;
}- Використовуйте DI у команді
- Інжектіть сервіси через конструктор або через резолв у методі.
- Запускайте команду
php artisan billing:sync --dry-run- Опціонально: планування
- Зареєструйте команду в scheduler, щоб запускати її автоматично.
Кастомні команди ідеально підходять для повторюваних backend-операцій та DevOps-автоматизації.
108. Що таке macros і коли вони корисні?
Macros дозволяють додавати власні методи до класів фреймворку під час виконання (до macroable-класів) без зміни вихідного коду Laravel.
- Поширені macroable-цілі
Collection,Str,ResponseFactory,Routeтощо.
- Приклад
use Illuminate\Support\Collection;
Collection::macro('toKeyValue', function (string $key, string $value) {
return $this->mapWithKeys(fn ($item) => [$item[$key] => $item[$value]]);
});- Коли корисно
- Повторювана утилітарна логіка по всій кодовій базі.
- Domain-specific helper-методи для колекцій/рядків.
- Більш виразний API для типових трансформацій.
- Best practices
- Реєструйте macros у service provider.
- Обирайте чіткі назви, щоб уникати колізій.
- Не зловживайте: для складної поведінки краще окремі класи.
Macros найкраще підходять для невеликих, часто вживаних розширень фреймворку.
109. Що таке Actions в архітектурі Laravel і коли їх використовувати?
Actions — це сфокусовані класи, які інкапсулюють один бізнесовий use case (одну прикладну операцію).
- Що таке Action
- Клас на кшталт
CreateOrderAction,PublishPostAction,RefundPaymentAction. - Зазвичай має один метод (
handle()абоexecute()).
- Навіщо використовувати Actions
- Забирають бізнес-логіку з контролерів/моделей.
- Повторно використовуються з HTTP-контролерів, jobs, console-команд і listeners.
- Легше unit-тестуються завдяки чітким вхідним/вихідним контрактам.
- Типова структура
final class CreateOrderAction
{
public function __construct(private OrderRepository $orders) {}
public function handle(CreateOrderData $data): Order
{
// business logic
}
}- Коли використовувати
- Нетипові або нетривіальні use case з оркестрацією правил.
- Логіка, що використовується з кількох точок входу.
- Команди, які застосовують service/action або CQRS-подібну архітектуру.
Actions покращують модульність і роблять бізнесові workflows явними.
110. Поясніть Repository Pattern і його переваги.
Repository Pattern абстрагує доступ до даних через інтерфейси, щоб бізнес-логіка не була жорстко прив’язана до ORM/деталей запитів.
- Базова ідея
- Визначаєте контракт (наприклад,
OrderRepository). - Надаєте реалізацію (наприклад,
EloquentOrderRepository). - Інжектите репозиторій у сервіси/actions.
- Переваги
- Чітке розділення між domain/application логікою та persistence-шаром.
- Простішe тестування через fake/in-memory репозиторії.
- Централізація складної query-логіки та caching-стратегій.
- Легша заміна джерела даних у майбутньому.
- Компроміси
- Додатковий шар абстракції й більше boilerplate-коду.
- Не завжди виправданий для дуже простих CRUD-застосунків.
- Прагматична рекомендація
- Використовуйте репозиторії там, де доступ до даних складний або спільний для багатьох модулів.
- Уникайте over-engineering у простих секціях системи.
Repository Pattern цінний тоді, коли реально зменшує зв’язаність і складність, а не просто додає indirection.
111. Що таке Traits у PHP і як вони використовуються в Laravel?
Traits — це мовний механізм PHP для горизонтального повторного використання коду між класами без спадкування.
- Що дають traits
- Повторно використовувані методи/властивості через
use. - Спільну поведінку для класів, які не мають спільної ієрархії.
- Приклади використання в Laravel
- Фреймворкові traits, такі як
SoftDeletes,HasFactory,Notifiable,AuthorizesRequests,DispatchesJobs,ValidatesRequests.
- Приклад у моделі
use Illuminate\Database\Eloquent\SoftDeletes;
class Post extends Model
{
use SoftDeletes;
}- Best practices
- Тримайте traits невеликими й цілісними.
- Використовуйте їх для повторного використання поведінки, а не для маскування “роздутого” класу.
- Для складної domain-логіки віддавайте перевагу композиції/сервісам.
Traits — практичний механізм реюзу, який широко застосовується в Laravel internals і прикладному коді.
112. У чому різниця між Laravel і Lumen, і чи актуальний Lumen у 2026 році?
Laravel і Lumen мають спільне походження, але орієнтовані на різні архітектурні компроміси.
- Головні відмінності
- Laravel: повнофункціональний фреймворк (багата екосистема, first-party пакети, широкі конвенції, велика інтеграційність).
- Lumen: micro-framework варіант із фокусом на мінімалізм і простіші API-сценарії.
- Архітектура та екосистема
- Laravel має ширшу сумісність із first-party пакетами й повніший набір інструментів для розробки.
- Lumen навмисно “тонший” і не прагне повної сумісності з усією surface-областю пакетів Laravel.
- Контекст продуктивності
- Історично Lumen обирали для легковагових API.
- У сучасних версіях Laravel продуктивність суттєво покращилась, тому практичний розрив для багатьох навантажень зменшився.
- Чи актуальний Lumen у 2026 році?
- Для нових проєктів: зазвичай не рекомендований як базовий вибір в екосистемі Laravel.
- Для існуючих систем: залишається актуальним, якщо вже стабільно працює в продакшені.
- Типовий вибір у 2026: Laravel (з правильною оптимізацією) для більшості нових API та web backend-ів.
- Практичне правило вибору
- Нові продукти стартуйте на Laravel.
- Lumen залишайте переважно для підтримки legacy-сервісів із чіткими операційними причинами.
113. Що таке Eloquent ORM?
Eloquent ORM — це реалізація Active Record у Laravel для роботи з базою даних через PHP-об’єкти, а не через сирий SQL.
- Що він надає
- Відображення model-to-table.
- Інтеграцію з query builder.
- Керування зв’язками між моделями.
- Attribute casting, accessors/mutators, scopes, events.
- Чому команди його використовують
- Швидша розробка завдяки виразному синтаксису.
- Чистіший domain-код для типових CRUD-сценаріїв.
- Вбудовані конвенції, що зменшують boilerplate.
- Приклад
$users = User::query()
->where('is_active', true)
->latest()
->take(10)
->get();- Важливе зауваження
- Eloquent чудово підходить для більшості прикладних задач.
- Для вузькоспеціальних/звітних запитів query builder або raw SQL інколи кращі.
Eloquent — базовий data-access шар у більшості Laravel-застосунків.
114. Що таке Eloquent Models?
Eloquent Models — це PHP-класи, які представляють таблиці бази даних та інкапсулюють поведінку даних.
- Базова роль
- Кожна модель зазвичай мапиться на одну таблицю.
- Екземпляри моделі представляють окремі рядки таблиці.
- Що зазвичай містять моделі
- Fillable/guarded атрибути.
- Casts і роботу з датами.
- Relationships.
- Scopes і domain-specific методи.
- Базовий приклад
final class Post extends Model
{
protected $fillable = ['title', 'body', 'published_at'];
protected function casts(): array
{
return [
'published_at' => 'datetime',
];
}
}- Чому це важливо
- Централізують persistence-логіку та поведінку сутності.
- Підвищують читабельність і узгодженість операцій із даними.
Eloquent-моделі — ключові будівельні блоки database-driven застосунків на Laravel.
115. Поясніть one-to-one, one-to-many, many-to-many і polymorphic relationships.
Eloquent-зв’язки визначають, як моделі пов’язані між собою в структурі даних.
- One-to-one (
hasOne/belongsTo)
- Один запис пов’язаний рівно з одним записом.
- Приклад:
Userмає одинProfile.
- One-to-many (
hasMany/belongsTo)
- Один батьківський запис має багато дочірніх.
- Приклад:
Postмає багатоComment.
- Many-to-many (
belongsToMany)
- Обидві сторони можуть мати багато пов’язаних записів.
- Потребує pivot-таблиці.
- Приклад:
Userналежить багатьомRole.
- Polymorphic
- Модель може належати більш ніж одному типу батьківської моделі через спільний інтерфейс.
- Приклад:
Commentможе належатиPostабоVideo.
- Чому це важливо
- Зв’язки чітко відображають структуру домену.
- Eloquent може завантажувати пов’язані дані, обмежувати запити й спрощувати join-операції.
Правильний вибір типу зв’язку — ключ до чистого дизайну схеми та ефективних запитів.
116. Що таке polymorphic relationships і коли їх використовувати?
Polymorphic relationships дозволяють одній моделі бути пов’язаною з кількома типами моделей через одну пару колонок (зазвичай *_type і *_id).
- Як це працює
- Дочірня таблиця зберігає тип батьківської моделі + її ID.
- Одна дочірня модель може посилатися на різні батьківські моделі.
- Типові приклади
CommentдляPost,Video,Product.ImageдляUser,Team,Article.Activityдля кількох типів сутностей.
- Методи зв’язків у Laravel
morphToна дочірній моделі.morphMany/morphOneна батьківській моделі.morphToMany/morphedByManyдля polymorphic many-to-many.
- Коли використовувати
- Коли поведінка спільна для різнорідних батьківських сутностей.
- Коли потрібна одна універсальна дочірня таблиця замість кількох паралельних.
- Компроміс
- Більш гнучка схема, але інколи складніші запити й вищі вимоги до індексації.
Використовуйте polymorphic-зв’язки там, де вони справді зменшують дублювання і природно відповідають доменній моделі.
117. Що таке eager loading?
Eager loading означає, що пов’язані моделі завантажуються наперед у межах основного запиту, а не підтягуються пізніше для кожного елемента окремо.
- Як це робиться
$posts = Post::with(['author', 'comments'])->latest()->get();- Чому це важливо
- Зменшує загальну кількість SQL-запитів.
- Запобігає проблемі N+1.
- Покращує час відповіді й ефективність роботи БД.
- Корисні варіанти
- Nested eager loading:
with('comments.user'). - Constrained eager loading через closures.
- Default eager loading через
$withу моделі, якщо зв’язок потрібен майже завжди.
Eager loading — одна з базових практик оптимізації продуктивності в Eloquent.
118. Що таке проблема N+1 і як її вирішити?
Проблема N+1 виникає, коли виконується 1 запит на список записів, а потім ще по одному запиту на кожен елемент для пов’язаних даних.
- Типовий сценарій
- Ви отримали 100 постів.
- У циклі звертаєтесь до
$post->author. - У підсумку маєте 101 запит (1 + 100).
- Чому це погано
- Різко зростає кількість запитів.
- Підвищується latency і навантаження на БД.
- Погіршується масштабованість під трафіком.
- Як вирішити в Laravel
- Використовувати eager loading через
with().
$posts = Post::with('author')->get();- Використовувати
load()/loadMissing(), якщо колекція моделей уже отримана. - Застосовувати профайлінг (Telescope/Debugbar/логи) для виявлення “гарячих” місць.
- Best practice
- Плануйте потрібні зв’язки на етапі побудови запиту.
- Перевіряйте цикли по моделях на приховані lazy-load виклики.
Усунення N+1 — одна з найефективніших оптимізацій продуктивності в Eloquent.
119. Що таке lazy eager loading?
Lazy eager loading завантажує зв’язки після того, як моделі вже отримані, але все одно пакетно, а не по одній моделі.
- Коли використовується
- Ви спочатку отримали моделі.
- Пізніше вирішили, які саме зв’язки потрібно підтягнути.
- Методи
load()завантажує вказані зв’язки.loadMissing()завантажує лише ті, що ще не завантажені.
$posts = Post::latest()->take(50)->get();
$posts->load('author', 'comments');- Чому це корисно
- Уникає N+1, зберігаючи гнучкий контроль потоку.
- Підходить для умовної логіки або шарованих сервісів.
- Різниця з eager loading
- Eager loading:
with()до виконання SQL-запиту. - Lazy eager loading:
load()після виконання SQL-запиту.
Lazy eager loading — практичний компроміс між гнучкістю та продуктивністю.
120. Що таке global scopes і local scopes?
Scopes — це повторно використовувані обмеження запитів в Eloquent.
- Global scopes
- Автоматично застосовуються до всіх запитів моделі.
- Підходять для наскрізних правил (наприклад, tenant isolation, soft delete поведінка, active-only записи).
- Local scopes
- Викликаються явно в запитах, коли потрібно.
- Дають сфокусовані повторно використовувані фільтри.
public function scopePublished(Builder $query): Builder
{
return $query->whereNotNull('published_at');
}
$posts = Post::published()->get();- Коли що обирати
- Global scope: дефолтне бізнес-правило, яке має діяти майже всюди.
- Local scope: опційний фільтр для конкретних use case.
- Застереження
- Надмірне використання global scopes може “ховати” дані неочікувано; документуйте їх явно.
Scopes покращують узгодженість і прибирають дублювання умов у запитах.
121. Що таке query scopes?
Query scopes — це методи моделі, які інкапсулюють повторно використовувані обмеження запиту для чистішого та композиційного query-коду.
- Патерн local query scope
- Ім’я методу починається з
scope. - У виклику префікс не використовується.
public function scopeActive(Builder $query): Builder
{
return $query->where('is_active', true);
}
public function scopeRecent(Builder $query): Builder
{
return $query->latest('created_at');
}
$users = User::active()->recent()->get();- Переваги
- Повторне використання фільтрів.
- Краща читабельність query-chain.
- Централізація логіки умов.
- Практичне застосування
- Фільтри статусів (
active,published,archived). - Діапазони дат (
recent,betweenDates). - Бізнес-обмеження (
visibleTo,forTenant).
Query scopes — ключовий інструмент для виразних і підтримуваних Eloquent-запитів.
122. Що таке accessors і mutators?
Accessors і mutators визначають, як атрибути моделі трансформуються при читанні та записі.
- Accessor
- Трансформує значення, коли воно зчитується з моделі.
- Mutator
- Трансформує значення перед записом у модель.
- Сучасний стиль (
Attribute)
use Illuminate\Database\Eloquent\Casts\Attribute;
protected function title(): Attribute
{
return Attribute::make(
get: fn (string $value) => ucfirst($value),
set: fn (string $value) => strtolower(trim($value)),
);
}- Типові use case
- Нормалізація вводу (trim/форматування регістру).
- Представлення обчислених/відформатованих значень.
- Трансформації на кшталт шифрування/дешифрування.
- Різниця з casts
- Casts покривають типові перетворення типів.
- Accessors/mutators покривають кастомні, domain-specific трансформації.
Вони допомагають централізувати логіку перетворення атрибутів і робити її послідовною.
123. Що таке casts в Eloquent?
Casts визначають, як Eloquent автоматично перетворює атрибути моделі між “сирими” значеннями БД і PHP-типами.
- Що роблять casts
- Конвертують значення під час читання/запису.
- Роблять роботу з атрибутами послідовною й типобезпечною.
- Поширені типи casts
integer,float,decimal:2,booleandatetime,immutable_datetimearray,json,object,collectionencrypted,hashed
- Приклад
protected function casts(): array
{
return [
'is_active' => 'boolean',
'price' => 'decimal:2',
'meta' => 'array',
'published_at' => 'datetime',
];
}- Чому це важливо
- Менше ручного коду для парсингу/форматування.
- Менше неочевидних помилок типів.
- Краща читабельність domain-коду.
Casts — фундаментальна можливість для чистого керування атрибутами моделей.
124. Що таке Attribute objects у сучасному Laravel?
Attribute objects — це сучасний спосіб визначати accessors і mutators в одному місці для конкретного поля моделі.
- Базова ідея
- Метод повертає
Attribute::make(get: ..., set: ...). - Чітко інкапсулює read/write-трансформації.
- Приклад
use Illuminate\Database\Eloquent\Casts\Attribute;
protected function name(): Attribute
{
return Attribute::make(
get: fn (string $value) => ucwords($value),
set: fn (string $value) => strtolower(trim($value)),
);
}- Переваги
- Чистіше, ніж legacy-методи
getXxxAttribute/setXxxAttribute. - Getter і setter-логіка згрупована в одному методі.
- Простіше читати, тестувати та підтримувати.
- Коли використовувати
- Кастомне форматування, нормалізація, шифрування або мапінг на value object для конкретних атрибутів.
Attribute objects — рекомендований сучасний патерн для accessors/mutators у поточних версіях Laravel.
125. Як реалізувати WebSockets у Laravel?
У Laravel WebSockets зазвичай реалізують через зв’язку Broadcasting + Reverb (або сумісну websocket-інфраструктуру) + Echo на фронтенді.
- Налаштування backend
- Сконфігурувати broadcasting driver і websocket server.
- Описати broadcastable events та авторизацію каналів.
- Налаштування frontend
- Ініціалізувати Laravel Echo з websocket-конектором.
- Підписатися на канали й слухати події.
- Безпека каналів
- Для захищених потоків використовувати private/presence канали.
- Операційні аспекти
- Масштабувати websocket-інстанси під навантаження.
- Моніторити кількість з’єднань, частоту повідомлень і reconnect-поведінку.
- Типові сценарії
- Realtime-сповіщення, чат, колаборація, live-дашборди.
У сучасному Laravel зв’язка Reverb + Echo є стандартним first-party шляхом для WebSocket-функціоналу.
126. У чому різниця між feature tests і unit tests?
Feature-тести й unit-тести відрізняються насамперед рівнем охоплення та глибиною інтеграції.
- Unit tests
- Перевіряють невеликий ізольований фрагмент логіки (клас/метод).
- Зазвичай мають мінімум framework-контексту.
- Залежності часто мокаються.
- Feature tests
- Перевіряють поведінку системи через фреймворкові межі.
- Часто охоплюють маршрути, middleware, валідацію, БД, auth і структуру відповіді.
- Коли що застосовувати
- Unit tests: складна чиста бізнес-логіка.
- Feature tests: ключові user/API-флоу та інтеграційна впевненість.
- Практичний баланс
- Комбінуйте обидва підходи: unit для швидких точкових перевірок, feature для end-to-end поведінки.
Unit-тест відповідає на питання “чи правильно працює цей компонент?”, feature-тест — “чи правильно працює сценарій у системі?”.
127. Як factories покращують тестування?
Factories роблять тести коротшими, зрозумілішими та стабільнішими завдяки швидкій генерації реалістичних даних.
- Менше рутинного setup
- Не потрібно вручну готувати великі масиви тестових даних.
- Сценарність через states
- Можна легко задавати варіації (
admin,inactive,paidтощо).
- Зручні зв’язки
- Просто створювати пов’язані моделі для інтеграційних кейсів.
- Підтримуваність
- Централізована генерація даних зменшує дублювання в тестах.
Factories дозволяють фокусуватися на поведінці системи, а не на технічній підготовці фікстур.
128. Як factories покращують тестування?
Factories значно спрощують підготовку даних у тестах і роблять тести читабельнішими.
- Менше boilerplate
- Не потрібно вручну створювати великі масиви фікстур для кожного тесту.
- Краща виразність
- Через states легко описати потрібний сценарій (
admin,inactive,paidтощо).
- Робота зі зв’язками
- Зручно створювати модельні графи (
for(),has()) для інтеграційних кейсів.
- Швидша підтримка тестів
- Централізовані правила генерації даних зменшують дублювання й вартість змін.
Factories дозволяють тестам фокусуватися на поведінці, а не на рутинній підготовці даних.
129. Як factories покращують тестування?
Factories спрощують підготовку тестових даних і роблять тести читабельнішими.
- Менше boilerplate для створення моделей.
- Зручні states для різних сценаріїв.
- Просте створення зв’язків між моделями.
- Централізована генерація даних полегшує підтримку тестів.
Factories дозволяють фокусувати тести на поведінці, а не на рутинному setup.
130. Як тестувати API в Laravel?
API в Laravel тестують через HTTP test helpers із перевіркою статусів, JSON-контрактів і побічних ефектів.
- Використовуйте
getJson,postJson,putJson,deleteJson. - Перевіряйте статуси та структуру/фрагменти JSON.
- Покривайте auth/authorization сценарії.
- Перевіряйте зміни в БД і side effects.
Повноцінний API-тест має включати happy-path, validation errors і forbidden/unauthorized кейси.
131. Як fake-нути queues, events, notifications і mail у тестах?
Laravel надає вбудовані fakes, щоб перевіряти dispatch/send без виконання реальних побічних дій.
- Queue fake
Queue::fake();
Queue::assertPushed(SendInvoiceJob::class);- Event fake
Event::fake();
Event::assertDispatched(OrderPaid::class);- Notification fake
Notification::fake();
Notification::assertSentTo($user, InvoicePaidNotification::class);- Mail fake
Mail::fake();
Mail::assertSent(InvoicePaidMail::class);Fakes пришвидшують тести й роблять їх детермінованими.
132. Що таке Pest PHP і чому він популярний у Laravel?
Pest — це тестовий фреймворк поверх PHPUnit із лаконічним синтаксисом і сильною інтеграцією в Laravel-екосистему.
- Виразніший і коротший синтаксис тестів.
- Менше шаблонного коду.
- Збереження сумісності з PHPUnit.
- Кращий developer experience для команд.
Pest популярний, бо прискорює написання/читання тестів без втрати надійності.
133. Як мокати Facades?
Facades у Laravel можна мокати напряму через вбудовані mock-можливості.
- Базовий приклад
Cache::shouldReceive('put')
->once()
->with('key', 'value', 60);- Для чого це корисно
- Перевірити, що facade-метод викликано з правильними аргументами.
- Підставити контрольовані повернення в тесті.
- Архітектурна порада
- У core-бізнес логіці часто краще DI + mock інтерфейсу.
- Facade mocking зручний для framework glue-коду.
Facade mocking — практичний інструмент, але для критичного доменного коду DI зазвичай стабільніший.
134. Як мокати Facades?
Facades у Laravel можна мокати напряму через вбудований mock-API.
- Базовий приклад
Cache::shouldReceive('put')
->once()
->with('key', 'value', 60);- Коли це корисно
- Перевірити, що facade-метод був викликаний з очікуваними аргументами.
- Повернути контрольоване значення в тесті.
- Практична порада
- Для core-доменної логіки зазвичай краще DI + моки інтерфейсів.
- Facade mocking добре підходить для framework glue-коду.
Facade mocking зручний, але не має підміняти архітектурно чистий dependency injection там, де він доречний.
135. Як тестувати queued jobs?
Тестування queued jobs зазвичай ділиться на дві частини: перевірка dispatch та перевірка логіки виконання.
- Dispatch-перевірка
Queue::fake()+Queue::assertPushed(...).
- Перевірка логіки job
- Окремо тестуйте
handle()з моками залежностей.
- Retry/failure сценарії
- Перевіряйте ідемпотентність та поведінку при помилках.
Такий поділ робить тести точнішими: окремо orchestration, окремо business logic.
136. Як тестувати events і listeners?
Events/listeners варто тестувати окремо на dispatch і на реакцію обробника.
- Dispatch
Event::fake()+Event::assertDispatched(...).
- Listener behavior
- Тестуйте side effects listener-а (БД, mail, jobs, notifications).
- Queued listeners
- Перевіряйте, що обробка стає в чергу, коли це очікується.
Це дає впевненість і в події, і в бізнес-реакції на неї.
137. Що таке parallel testing?
Parallel testing запускає тести в кількох процесах одночасно, щоб скоротити загальний час виконання.
- Тести діляться між worker-процесами.
- Кожен процес виконує свою частину suite паралельно.
- Вимагає коректної ізоляції ресурсів (особливо БД).
Parallel testing значно пришвидшує CI і локальний feedback loop для великих проєктів.
138. Як покращити продуктивність тестів?
Покращення продуктивності тестів — це баланс між швидкістю та довірою до результатів.
- Тримайте healthy mix unit + feature тестів.
- Використовуйте parallel testing.
- Мінімізуйте важкі setup-кроки.
- Фейкайте дорогі зовнішні side effects.
- Профілюйте повільні тести та усувайте hot spots.
Найбільший ефект дає фокус на ізоляцію, простоту та вимірювання.
139. Які переваги використання Vue.js з Laravel?
Vue.js добре поєднується з Laravel завдяки простій інтеграції та високій швидкості розробки.
- Проста інтеграція через Vite.
- Зручний компонентний підхід для динамічного UI.
- Гарна сумісність з Inertia або API-driven SPA.
Це практичний full-stack вибір для багатьох продуктів на Laravel.
140. Що таке Inertia.js і як він працює?
Inertia.js дозволяє будувати SPA-подібний UX без окремого публічного API-шару для сторінок.
- Laravel-контролер повертає назву frontend-компонента + props.
- Inertia на клієнті робить навігацію без повного перезавантаження.
- UI пишеться на Vue/React/Svelte, а backend routing лишається в Laravel.
Inertia поєднує переваги моноліту та сучасного frontend UX.
141. Що таке Livewire і коли його використовувати?
Livewire — це Laravel-first підхід до створення динамічного UI через server-driven компоненти без потреби у великому custom JavaScript.
- Як працює
- Компоненти описуються PHP-класами + Blade.
- Взаємодії в браузері тригерять запити на сервер.
- Сервер повертає оновлення стану/DOM.
- Коли використовувати
- Admin-панелі та внутрішні інтерфейси.
- Form-heavy бізнес-флоу.
- Команди з сильним PHP-фокусом.
- Переваги
- Висока швидкість розробки.
- Тісна інтеграція з auth/validation/policies Laravel.
Livewire доречний, коли потрібен reactive UI без складної SPA-архітектури.
142. Порівняйте Livewire, Inertia і традиційний SPA-підхід.
Ці підходи відрізняються місцем, де живе основна UI-логіка та стан.
- Livewire
- Server-driven компоненти (PHP + Blade).
- Мінімум JS.
- Inertia
- Client-rendered сторінки (Vue/React/Svelte), але routing/data flow контролює Laravel.
- Традиційний SPA
- Окремий frontend-застосунок + окремий REST/GraphQL API backend.
- Максимальна frontend-автономія, але вища загальна складність.
- Практичний вибір
- Livewire: швидкий Laravel-centric development.
- Inertia: SPA-like UX без повного розділення backend/frontend.
- SPA: коли потрібна повна декуплінг-архітектура.
143. Що таке TALL stack?
TALL stack = Tailwind CSS + Alpine.js + Laravel + Livewire.
- Склад
- Laravel — backend.
- Livewire — реактивні server-driven компоненти.
- Alpine.js — легка frontend-інтерактивність.
- Tailwind CSS — utility-first стилізація.
- Чому популярний
- Швидка full-stack розробка без важкого SPA-стеку.
- Добре підходить для CRUD/admin/business застосунків.
- Сильні сторони
- Висока швидкість ітерацій.
- Laravel-first workflow.
- Нижча frontend-складність у багатьох практичних кейсах.
TALL — продуктивний стек для команд, які хочуть швидко будувати Laravel-продукти.
144. Що таке SSR (Server-Side Rendering) і чи підтримує його Laravel?
SSR означає рендер HTML на сервері до того, як сторінка потрапить у браузер.
- Дає кращий first paint і SEO для контентних сторінок.
- У Laravel SSR є нативно через Blade.
- Також можливий SSR у hybrid-стеках з JS-фреймворками.
Laravel підтримує SSR-патерни як у класичному, так і в гібридному форматі.
145. Як Laravel інтегрується з React і Vue?
Laravel інтегрується з React/Vue через Vite і кілька архітектурних стилів.
- Blade + вбудовані компоненти React/Vue.
- Inertia.js як SPA-like підхід.
- Повністю decoupled SPA, що споживає Laravel API.
Гнучкість інтеграції дозволяє обрати формат під команду й продукт.
146. Що таке Ziggy у Laravel?
Ziggy — пакет, що переносить named routes Laravel у JavaScript.
- Прибирає hardcoded URL на фронтенді.
- Дозволяє генерувати маршрути через JS
route(...). - Полегшує рефакторинг route-ів без розсинхрону frontend/backend.
Ziggy покращує узгодженість URL-контракту між сервером і клієнтом.
147. Що таке Laravel Sail?
Laravel Sail — офіційне Docker-оточення для локальної розробки Laravel.
- Готовий стек сервісів (PHP, БД, Redis тощо).
- Швидкий онбординг.
- Однакове середовище для всієї команди.
Sail спрощує стабільну локальну розробку без ручного налаштування інфраструктури.
148. Що таке Laravel Forge?
Laravel Forge — сервіс для provisioning і deployment PHP/Laravel серверів.
- Автоматизує налаштування серверів.
- Спрощує SSL, процеси, deploy scripts.
- Зменшує DevOps-навантаження для команд.
Forge допомагає швидко вести Laravel у production.
149. Що таке Laravel Vapor?
Laravel Vapor — serverless платформа для Laravel на AWS.
- Орієнтація на managed serverless інфраструктуру.
- Автомасштабування та зменшення server-ops.
- Підходить для проєктів із змінним навантаженням.
Vapor — Laravel-first шлях до serverless deployment.
150. Що таке Laravel Envoyer?
Laravel Envoyer — інструмент для zero-downtime deployment.
- Release-based деплой без зупинки застосунку.
- Безпечне перемикання релізів.
- Зручні rollback-сценарії.
Envoyer фокусується на стабільних безперервних деплоях.
151. Що таке Laravel Pennant?
Laravel Pennant — first-party feature flag система.
- Керує включенням/виключенням фіч за правилами.
- Дає gradual rollout.
- Дозволяє швидко відкотити проблемну фічу без повного rollback релізу.
Pennant знижує ризик релізів і покращує контроль впровадження змін.
152. Що таке Laravel Pulse?
Laravel Pulse — first-party інструмент realtime-інсайтів по стану застосунку.
- Показує важливі сигнали продуктивності й навантаження.
- Допомагає швидше діагностувати проблеми.
- Добре доповнює стандартні логи й метрики.
Pulse дає практичну observability-картину в екосистемі Laravel.
153. Що таке Laravel Telescope?
Laravel Telescope — інструмент дебагу та introspection для локального/стейдж середовища.
- Відстежує запити, exceptions, jobs, mail, queries тощо.
- Прискорює аналіз поведінки застосунку.
- Зазвичай обмежується для production через чутливість даних.
Telescope — один із найкорисніших інструментів для debugging у Laravel.
154. Що таке Laravel Scout?
Laravel Scout — абстракція full-text пошуку для Eloquent моделей через зовнішні search engines.
- Індексує модельні дані у пошуковий backend.
- Надає простий API для пошуку.
- Дає релевантніший пошук, ніж звичайний SQL
LIKE.
Scout — зручний шар для production-grade search у Laravel.
155. Які пошукові движки підтримує Laravel Scout?
Найпоширеніші backends для Scout:
- Algolia
- Meilisearch
- Typesense
Також можливі community/custom драйвери (залежно від архітектурних вимог).
156. Що таке Laravel Cashier?
Laravel Cashier — пакет для підписок і recurring billing.
- Керує планами, підписками, trial, інвойсами.
- Прибирає великий обсяг кастомного платіжного boilerplate.
- Особливо корисний для SaaS-моделей.
Cashier прискорює впровадження subscription-білінгу в Laravel.
157. Що таке Laravel Socialite?
Laravel Socialite — пакет для OAuth-логіну через зовнішніх провайдерів.
- Стандартизує login-flow для “Login with ...”.
- Полегшує інтеграцію з Google/GitHub/Facebook та іншими.
- Дає єдиний API поверх різних OAuth-провайдерів.
Socialite спрощує third-party auth у Laravel.
158. Що таке Laravel Pint?
Laravel Pint — opinionated code style fixer на базі PHP-CS-Fixer.
- Автоматично приводить код до єдиного стилю.
- Зменшує шум у diff і code review.
- Зручно запускати локально й у CI.
Pint підвищує консистентність коду в команді.
159. Що таке Laravel Folio?
Laravel Folio — file-based routing підхід для page-oriented Laravel застосунків.
- Маршрути будуються за файловими конвенціями.
- Менше route-boilerplate для контентних сторінок.
- Швидше масштабування структури простих page-flow.
Folio — альтернатива класичному route-дизайну для певних типів застосунків.
160. Що таке Laravel Precognition?
Laravel Precognition дозволяє робити попередню backend-валідацію форми до фінального submit.
- Дає швидкий validation feedback під час введення.
- Використовує ті самі server-side правила як source of truth.
- Покращує UX складних форм.
Precognition прибирає дублювання валідації між frontend і backend.
161. Що таке PHP generators і коли їх варто використовувати?
Generators (yield) повертають значення ліниво, по одному, без побудови великої структури в пам’яті.
- Знижують memory usage на великих наборах.
- Добрі для потокової обробки файлів/даних.
- Підходять для послідовних pipeline-алгоритмів.
Generators — ключ до memory-efficient ітерації в PHP.
162. Що таке PHP attributes?
Attributes (#[...]) — нативні метадані в PHP.
- Прив’язуються до класів/методів/властивостей/параметрів.
- Замінюють частину docblock-анотацій.
- Полегшують інтеграцію з tooling і framework-логікою.
Attributes роблять метадані структурованими та машиночитними.
163. Поясніть strict types у PHP.
declare(strict_types=1); вмикає сувору перевірку scalar-типів у файлі.
- Без strict types PHP може робити неявні перетворення.
- З strict types невідповідність типу дає
TypeError. - Це підвищує передбачуваність і безпеку рефакторингу.
Strict types — важливий елемент сучасного production PHP-стилю.
164. Поясніть require, include, require_once, include_once.
Ці конструкції підключають PHP-файли з різною поведінкою при помилках і повторних включеннях.
require— фатальна помилка, якщо файл недоступний.include— warning, виконання може продовжитись._once-варіанти підключають файл лише один раз.
У сучасних Laravel/PHP-проєктах основним механізмом лишається Composer autoload.
165. Що таке WeakMap і яку проблему він вирішує?
WeakMap зберігає дані, прив’язані до об’єктів, не заважаючи збирачу сміття видаляти ці об’єкти.
- Ключами можуть бути лише об’єкти.
- Коли об’єкт-ключ знищується, відповідний запис зникає автоматично.
- Це зручно для тимчасових метаданих і кешів без memory leaks.
WeakMap корисний, коли потрібно пов’язати “додатковий стан” з об’єктом без ризику утримувати його в пам’яті зайво довго.
166. Що таке spread/splat оператор у PHP?
Оператор ... у PHP використовується для розпакування значень і variadic-аргументів.
- Розпакування аргументів
$args = [2, 3];
$result = sum(...$args);- Розпакування масивів
$a = [1, 2];
$b = [...$a, 3, 4];- Variadic-параметри
function logAll(string ...$messages): void {}... робить код коротшим і зручнішим для композиції аргументів/даних.
167. Що таке enums у PHP 8.1+?
Enums — нативний тип для фіксованої множини дозволених значень/станів.
- Є unit enums і backed enums.
- Прибирають “магічні рядки”.
- Покращують type safety і читабельність домену.
Enums — дефолтний сучасний спосіб опису finite-state в PHP.
168. Що таке readonly properties у PHP?
Readonly-властивість можна встановити один раз (частіше в конструкторі), після чого змінювати не можна.
- Менше випадкових мутацій.
- Краща модель immutable DTO/value objects.
- Чіткіші контракти стану об’єкта.
Readonly properties підвищують надійність об’єктного дизайну.
169. Що таке readonly classes у PHP 8.2+?
readonly class робить усі instance-властивості класу readonly.
- Імм’ютабельність задається на рівні всього класу.
- Менше шаблонного коду.
- Добре підходить для value objects/DTO.
Readonly classes спрощують дисципліну незмінності даних.
170. Що таке intersection types і union types?
Union і intersection типи дозволяють точніше описувати контракти.
A|B(union): значення може бути одного з типів.A&B(intersection): значення має відповідати всім типам одночасно.
Вони підвищують виразність API та якість static analysis.
171. Що таке anonymous classes?
Anonymous class — клас без імені, що створюється inline.
- Корисний для одноразових імплементацій.
- Зручний у тестах як локальний double.
- Для багаторазової логіки краще named class.
Anonymous classes — інструмент локальної лаконічності в коді.
172. Що таке first-class callables у PHP?
First-class callables дають короткий синтаксис отримання callable через ....
- Краща читабельність callback-коду.
- Краще для рефакторингу, ніж string-callables.
- Зручно в map/filter/pipeline сценаріях.
Це сучасний безпечний спосіб роботи з callback-ами.
173. Що таке fibers у PHP?
Fibers — low-level примітив кооперативної конкурентності в PHP 8.1+.
- Дають можливість suspend/resume виконання.
- Це не потоки й не паралелізм “сам по собі”.
- Використовуються асинхронними рантаймами/бібліотеками.
Fibers — фундамент для advanced async-моделей у PHP.
174. Що таке backed enums?
Backed enums — enums, чиї case-и мають scalar-значення (string або int).
- Зручні для збереження в БД і серіалізації в API.
- Дають типобезпеку + стабільний формат значення.
- Підтримують
from()іtryFrom().
Backed enums — практичний стандарт для доменних статусів із persistence.
175. У чому різниця між interfaces, abstract classes і traits?
- Interface — контракт без реалізації.
- Abstract class — часткова реалізація + спільний стан.
- Trait — горизонтальний реюз методів між класами.
Вибір залежить від задачі: контракт, базова поведінка або локальний реюз.
176. Що таке SOLID і як ці принципи застосовуються в Laravel?
SOLID — набір OOP-принципів для гнучкої та підтримуваної архітектури.
- Thin controllers, SRP.
- Розширення через інтерфейси/події (OCP).
- Сумісні реалізації контрактів (LSP).
- Малі цільові інтерфейси (ISP).
- Залежність від абстракцій через container/DI (DIP).
У Laravel SOLID реалізується через contracts, service container і модульний дизайн.
177. Які design patterns найчастіше використовують у Laravel-застосунках?
Поширені патерни:
- Repository
- Factory
- Strategy
- Observer
- Command (jobs/commands)
- Adapter/Decorator (залежно від інтеграцій)
Патерни мають зменшувати складність, а не додавати зайву абстракцію.
178. Поясніть Repository, Factory, Strategy, Observer.
- Repository — абстрагує доступ до даних.
- Factory — централізує створення об’єктів.
- Strategy — взаємозамінні алгоритми за спільним інтерфейсом.
- Observer — реакції на події (у Laravel: events/listeners, model observers).
Ці патерни допомагають розділяти відповідальності й зменшувати зв’язаність.
179. Що таке PSR і які стандарти PSR найважливіші для Laravel-розробника?
PSR (PHP Standards Recommendations) — стандарти інтероперабельності від PHP-FIG.
Найважливіші для Laravel:
- PSR-1 / PSR-12 — coding style.
- PSR-3 — logger interface.
- PSR-4 — autoloading.
- PSR-7 — HTTP message interfaces (інтеграційні сценарії).
- PSR-11 — container interface концепції.
PSR-знання підвищує сумісність і якість архітектури в PHP-екосистемі.
180. Що таке Composer autoloading і як працює PSR-4?
Composer autoloading автоматично підвантажує класи без ручних require/include, а PSR-4 визначає стандарт відповідності namespace до файлової структури.
- Composer autoload
- Генерує автозавантажувач із конфігурації проєкту/пакетів.
- Підвантажує класи на вимогу.
- PSR-4 принцип
- Namespace-префікс мапиться на базову директорію.
- Частини namespace відповідають піддиректоріям.
- Ім’я класу відповідає імені файла.
- Приклад
App\\->app/App\\Services\\BillingService->app/Services/BillingService.php
Composer + PSR-4 — фундамент сучасної організації коду в PHP/Laravel-проєктах.