Laravel 13: AI SDK, JSON:API Resources і простіше оновлення
Вийшов Laravel 13 - велике оновлення без звичного болю при переході.
Почніть вводити, щоб шукати по статтях, вакансіях, компаніях, проєктах, ресурсах, пакетах, подіях і користувачах.
Статті, новини, туторіали та переклади від учасників спільноти
Вийшов Laravel 13 - велике оновлення без звичного болю при переході.
Файл маршрутів завантажується при кожному запиті. З 500+ маршрутами це багато.
Кешування маршрутів компілює маршрути в один закешований файл. В 10 разів швидше.
Як використовувати:
Запустити php artisan route:cache після деплою. Маршрути завантажуються з кешу, а не з файлів.
Важливі обмеження:
Closure маршрути НЕ працюють з кешуванням. Виникнуть помилки. Всі маршрути повинні використовувати синтаксис controller@method.
Найкраща практика:
Порада: Поєднувати з config:cache та view:cache для максимальної продуктивності.
// ПОГАНО: Не працює з route:cache
Route::get('/users', function () {
return User::all();
});
// ДОБРЕ: Працює з кешуванням
Route::get('/users', [UserController::class, 'index']);
// Команди деплою
php artisan config:cache // Кешувати конфіг
php artisan route:cache // Кешувати маршрути
php artisan view:cache // Кешувати view
// Розробка - очистити всі кеші
php artisan optimize:clear
// Перевірити що маршрути закешовані
php artisan route:list
// Має завантажуватись миттєво якщо закешовано
// В composer.json - авто-кеш після деплою
"scripts": {
"post-autoload-dump": [
"@php artisan route:cache"
]
}
Переказ $100 між рахунками. Гроші списані з Аліси. Сервер падає. Боб їх ніколи не отримує.
Без транзакцій часткові оновлення пошкодять дані.
Як це працює:
Всі запити виконуються як одна атомарна одиниця. Якщо щось не вдається - все відкочується назад. База даних ніколи не опиняється в неузгодженому стані.
Три способи використання:
Важливо:
Транзакції працюють тільки з InnoDB таблицями. Тримати їх короткими - вони блокують рядки. Довгі операції блокують інші запити.
Не змішувати виклики зовнішніх API з транзакціями бази даних.
// ПОГАНО: Часткове збереження при помилці
$user = User::create($data);
$profile = Profile::create(['user_id' => $user->id]);
// Якщо це не вдається, користувач існує без профілю
// ДОБРЕ: Все або нічого
DB::transaction(function () use ($data) {
$user = User::create($data);
$profile = Profile::create(['user_id' => $user->id]);
$user->sendWelcomeEmail();
});
// Ручний контроль
DB::beginTransaction();
try {
$order = Order::create($orderData);
$payment = Payment::create($paymentData);
DB::commit();
} catch (\Exception $e) {
DB::rollBack();
throw $e;
}
// З повтором при deadlock
DB::transaction(function () {
// Код
}, 3); // Повторити 3 рази якщо deadlock
Потрібна тільки одна колонка з одного рядка? Не треба завантажувати всю модель.
first() створює повну Eloquent модель. value() повертає тільки дані.
Різниця:
first() повертає екземпляр моделі з усіма атрибутамиvalue() повертає одне скалярне значенняpluck() повертає колекцію значень з кількох рядківКоли що використовувати:
Використовувати value() для однієї колонки, одного рядка.
Використовувати pluck() для однієї колонки, кількох рядків.
Використовувати first() тільки коли потрібні методи моделі.
Порада: На великих таблицях з багатьма колонками value() значно швидший.
// ПОГАНО: Завантажує повну модель з усіма колонками
$email = User::where('id', 1)->first()->email;
// ДОБРЕ: Повертає тільки рядок email
$email = User::where('id', 1)->value('email');
// Декілька рядків, одна колонка
$emails = User::where('active', true)->pluck('email');
// Повертає: Collection ['john@ex.com', 'jane@ex.com']
// Потрібні декілька колонок з кількох рядків?
$users = User::select('id', 'email')->get();
// З ключем за ID
$emails = User::pluck('email', 'id');
// Повертає: [1 => 'john@ex.com', 2 => 'jane@ex.com']
Сторінка завантажує 10 постів. База даних робить 101 запит.
1 запит для постів. 100 запитів для авторів. Класична проблема N+1.
Рішення: Eager Loading
Використання with() для завантаження зв'язків наперед. Один запит стає двома.
Порада: Laravel Debugbar показує всі запити. Спочатку встановити його.
Коли НЕ використовувати eager loading:
Просунутий трюк:
Використовувати withCount() коли потрібна тільки кількість, а не повний зв'язок.
// ПОГАНО: 101 запит
$posts = Post::all();
foreach ($posts as $post) {
echo $post->author->name; // Запит на кожен пост
}
// ДОБРЕ: 2 запити
$posts = Post::with('author')->get();
foreach ($posts as $post) {
echo $post->author->name; // Без додаткових запитів
}
// Завантажити декілька зв'язків
$posts = Post::with(['author', 'comments', 'tags'])->get();
// Вкладені зв'язки
$posts = Post::with('comments.author')->get();
// Потрібна тільки кількість?
$posts = Post::withCount('comments')->get();
echo $posts[0]->comments_count; // Зв'язок не завантажений
Вийшов Laravel 12.52.0. Реліз сфокусований на factory ergonomics, стабільності компіляції Blade та predictability у тестах.
Вийшов Laravel 12.51.0. Реліз зосереджений на контрольованій обробці, читабельній валідації та точковому контролі SQL-запитів.
Це не просто API-обгортка - це повний шар для AI у стилі Laravel.
Вийшов Laravel 12.50.0 з набором точкових, але дуже практичних оновлень. Фокус на безпеці типів, продуктивності та передбачуваній поведінці коду.
Матеріали за темою «Laravel»: усе, що ми писали про це українською. Нижче - суміжні теми, якщо шукаєте ширше.
Зараз опубліковано 150 матеріалів від 3 авторів. Останній матеріал - 12 вересня 2026.