MVC / MVP / MVVM - архітектурні підходи
Три споріднені підходи, що відділяють дані від представлення через проміжний шар. Чим відрізняються посередники і чому в Laravel базовий - MVC.
Почніть вводити, щоб шукати по статтях, вакансіях, компаніях, проєктах, ресурсах, пакетах, подіях і користувачах.
Статті, новини, туторіали та переклади від учасників спільноти
Три споріднені підходи, що відділяють дані від представлення через проміжний шар. Чим відрізняються посередники і чому в Laravel базовий - MVC.
Потрібно обробити 10 000 елементів? Або API обмежує 100 запитів за хвилину?
chunk() розбиває колекцію на менші групи.
Сценарії:
Відмінність від query chunk():
Collection chunk() працює з уже завантаженими даними. Query chunk() завантажує дані з бази порціями.
Порада: поєднувати з sleep() для API rate limit.
// Поділ на частини по 100
$users = User::all();
$users->chunk(100)->each(function ($batch) {
$this->sendBatchEmail($batch);
});
// API rate limit
$products = collect($apiProducts);
$products->chunk(50)->each(function ($batch) {
$this->syncToDatabase($batch);
sleep(1);
});
// Прогрес
$done = 0;
$users->chunk(100)->each(function ($batch) use (&$done) {
$batch->each(fn($u) => $this->process($u));
$done += $batch->count();
echo "Progress: {$done}\n";
});
// Комбінування з іншими методами
$users->chunk(100)->map(function ($chunk) {
return $chunk->pluck('email');
});
Переносить структуровані дані між шарами типізованим об'єктом без поведінки. Чому це краще за "сирі" масиви і де має жити валідація.
Потрібно змінити кожен елемент колекції?
map() і transform() роблять це, але працюють по-різному.
Різниця:
map() повертає НОВУ колекцію, оригінал залишається без змінtransform() змінює оригінальну колекціюЩо коли використовувати:
map() - коли початкові дані потрібні пізнішеtransform() - коли треба зекономити пам'ять на великих колекціяхПорада: map() дозволяє повністю змінювати структуру, transform() зберігає ключі.
// map() - створює нову колекцію
$users = User::all();
$names = $users->map(function ($user) {
return strtoupper($user->name);
});
// transform() - змінює оригінал
$users = User::all();
$users->transform(function ($user) {
$user->name = strtoupper($user->name);
return $user;
});
// map() з короткими функціями
$prices = collect([100, 200, 300]);
$withTax = $prices->map(fn($p) => $p * 1.2);
// Повна зміна структури
$formatted = $users->map(fn($user) => [
'id' => $user->id,
'label' => "{$user->name} ({$user->email})"
]);
// mapWithKeys - власні ключі
$users->mapWithKeys(fn($user) =>
[$user->email => $user->name]
);
Потрібен масив ID? Організовувати цикл і додавати значення вручну не потрібно.
pluck() дістає значення стовпця в простий масив. В один рядок.
Розширені можливості:
Коли варто використовувати:
Порада: використовувати pluck() безпосередньо на query builder - ефективніше, ніж завантажувати моделі.
// Погано: цикл і ручне збирання
$ids = [];
foreach ($users as $user) {
$ids[] = $user->id;
}
// Добре: один рядок
$ids = $users->pluck('id');
// [1, 2, 3, 4, 5]
// Із ключем
$userNames = $users->pluck('name', 'id');
// [1 => 'John', 2 => 'Jane', 3 => 'Bob']
// Безпосередньо з бази - ефективніше
$emails = User::pluck('email');
$emailsById = User::pluck('email', 'id');
// Dot notation
$posts = Post::with('author')->get();
$authorNames = $posts->pluck('author.name');
// Кілька рівнів
$comments = Comment::with('post.author')->get();
$authors = $comments->pluck('post.author.name');
// Для select
$countries = Country::pluck('name', 'code');
// ['US' => 'United States', 'GB' => 'United Kingdom']
Прибравши зайві запити, беремося за ті, що лишилися дорогими. Кеш результатів Eloquent-запитів через трейт Cacheable з автоматичною інвалідацією за тегами - найглибший із двох рівнів кешу, якими ми тримаємо origin під навалою AI-краулерів.
Передає об'єкту залежності ззовні замість створення їх усередині. Як контейнер Laravel резолвить залежності й чому конструктор кращий за app().
Jason McCreary, творець Laravel Shift, представив Double - PHP-бібліотеку для тестових дублів, яка замінює моки, шпигуни та часткові моки єдиним типом об'єкта. Бібліотека спрощує синтаксис, покращує повідомлення про помилки та інтегрується з PHPUnit.
Концентрує бізнес-логіку у виділеному шарі сервісів, лишаючи контролери тонкими. Як перевикористовувати правила між HTTP, CLI та чергами.
Матеріали за темою «PHP»: усе, що ми писали про це українською. Нижче - суміжні теми, якщо шукаєте ширше.
Зараз опубліковано 139 матеріалів від 3 авторів. Останній матеріал - 30 жовтня 2026.