Observer - реакція на події
Організовує реакції на події без жорстких зв'язків. У Laravel це Events, Listeners і Subscribers - як додавати реакції, не торкаючись джерела події.
Почніть вводити, щоб шукати по статтях, вакансіях, компаніях, проєктах, ресурсах, пакетах, подіях і користувачах.
Статті, новини, туторіали та переклади від учасників спільноти
Організовує реакції на події без жорстких зв'язків. У Laravel це Events, Listeners і Subscribers - як додавати реакції, не торкаючись джерела події.
Фільтруєте за зв'язком через where('user_id', $user->id)? Можна краще.
whereBelongsTo() сам підставляє зовнішній ключ.
Переваги:
Бонус: працює з масивом моделей.
Порада: дуже зручно в policy-методах, де фільтруєте по auth()->user().
// ПОГАНО: ручний foreign key
$posts = Post::where('user_id', $user->id)->get();
$comments = Comment::where('post_id', $post->id)->get();
// ДОБРЕ: Laravel сам визначає ключ
$posts = Post::whereBelongsTo($user)->get();
$comments = Comment::whereBelongsTo($post)->get();
// Кілька зв'язків
$comments = Comment::whereBelongsTo($user)
->whereBelongsTo($post)
->get();
// Кастомна назва зв'язку
$posts = Post::whereBelongsTo($user, 'author')->get();
// У policy - максимально чисто
public function update(User $user, Post $post)
{
return Post::whereBelongsTo($user)->exists();
}
Laravel відкрив прийом заявок на Founders Summit - камерну зустріч для засновників та керівників компаній, що побудовані на Laravel. Захід відбудеться в листопаді 2026 року, а його формат орієнтований на практичний обмін досвідом, а не на доповіді.
Зберігає знімок стану об'єкта і відновлює його, не порушуючи інкапсуляцію. Основа для undo/redo: ролі Originator, Memento та Caretaker.
Треба надіслати email після реєстрації? Або залогувати видалення поста?
Model Events дозволяють підключатися до create/update/delete.
Доступні події:
creating / createdupdating / updateddeleting / deletedsaving / savedДва підходи:
booted() у моделі (швидкий варіант)Порада: використовуйте creating для генерації UUID/slug до збереження.
База зберігає JSON як рядок. Ви всюди вручну робите decode.
Casts виконують перетворення типів автоматично. Ви працюєте з нативними типами PHP.
Поширені касти:
array / json - авто-encode/decodeboolean - 0/1 → true/falsedate / datetime - об'єкти Carbonencrypted - автоматичне шифрування/дешифруванняКастомні касти:
Можна створювати власні для складніших перетворень.
Порада: використовуйте encrypted для чутливих даних (напр. номери карток).
class User extends Model
{
protected $casts = [
'email_verified_at' => 'datetime',
'settings' => 'array',
'is_admin' => 'boolean',
'metadata' => 'json',
'birth_date' => 'date',
'salary' => 'decimal:2',
'credit_card' => 'encrypted',
];
}
// JSON cast - працюємо з масивами
$user->settings = ['theme' => 'dark', 'lang' => 'en'];
$user->save(); // Зберігається як JSON-рядок
$theme = $user->settings['theme']; // Авто-декод
// Datetime cast - Carbon
echo $user->email_verified_at->diffForHumans();
// Boolean cast
if ($user->is_admin) {
// 1/0 у базі, але в коді - true/false
}
Laravel SMS Catcher від Michal Skogemann - це інструмент для локальної розробки, що перехоплює вихідні SMS-повідомлення. Подібно до Mailpit для email, він надає візуальну панель для перегляду тексту та метаданих SMS під час локальної роботи.
Laravel Time Machine - новий пакет для профілювання продуктивності, що записує кожен етап обробки Laravel-запиту з точністю до мілісекунди. Надає візуальну хронологію від завантаження фреймворку до завершення, зберігає SQL-запити та виділяє повільні операції без використання бази даних.
Форматуєте дати у кожному контролері? Перетворюєте імена?
Accessors і Mutators роблять це в моделі.
Accessors - трансформація при читанні Mutators - трансформація при записі
Laravel 9+ синтаксис:
Через клас Attribute.
Переваги:
Порада: Ідеально для паролів, форматування дат і тексту.
use Illuminate\Database\Eloquent\Casts\Attribute;
class User extends Model
{
// Accessor
protected function name(): Attribute
{
return Attribute::make(
get: fn($value) => ucfirst($value),
);
}
// Mutator
protected function password(): Attribute
{
return Attribute::make(
set: fn($value) => bcrypt($value),
);
}
// Обидва
protected function firstName(): Attribute
{
return Attribute::make(
get: fn($value) => ucfirst($value),
set: fn($value) => strtolower($value),
);
}
}