Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Документація • Статті • Вакансії • Події • Екосистема • Тести

Усе про Laravel - в одному місці

Україномовна спільнота розробників: документація Laravel українською, вакансії, статті, події, відео та підготовка до співбесід

Будуй спільноту разом з нами - реєструйся та додавай свій контент

Популярні статті

Найбільш читані матеріали спільноти

Популярні вакансії

Пропозиції, які найчастіше переглядають

Готуєтесь до співбесіди?

Ми зібрали найпопулярніші питання з реальних співбесід на позиції Laravel розробника для рівнів Junior, Middle та Senior.

1739+ питань · Junior · Middle · Senior Режим флеш-карток для тренування

Laravel Tips & Tricks

Швидкі та корисні сніппети коду від спільноти

Tips 19 жовтня 2026

Валідація Enum - типобезпечні значення у формах

Статус може бути pending, active, inactive. Валідувати рядками?

PHP 8.1 Enums + Laravel validation = типобезпека.

Rule::enum() валідує значення по Enum case’ах автоматично.

Переваги:

  • Змінили Enum — валідація підлаштувалась
  • Жодних хардкод-рядків
  • Автодоповнення в IDE
  • Зручний рефакторинг

Порада: використовуйте backed enums (string/int) для збереження в БД.

enum OrderStatus: string
{
  case Pending = 'pending';
  case Processing = 'processing';
  case Completed = 'completed';
}

public function rules()
{
  return [
    'status' => ['required', Rule::enum(OrderStatus::class)],
  ];
}

// Каст у моделі - і жодних рядкових статусів
protected $casts = ['status' => OrderStatus::class];
Tips 16 жовтня 2026

`confirmed` - підтвердження пароля без ручних порівнянь

Робите підтвердження пароля й порівнюєте поля вручну?

confirmed робить це автоматично.

Як працює:

Перевіряє, що поле збігається з {field}_confirmation.

Для password автоматично очікує password_confirmation.

Конвенція:

  • Поле: password
  • Підтвердження: password_confirmation

Працює з:

будь-якими полями — пароль, email тощо.

Порада: поле _confirmation не потрібно валідувати окремо.

public function rules()
{
  return [
    'password' => 'required|confirmed|min:8',
    'email' => 'required|email|confirmed',
    'new_password' => 'required|confirmed|min:8',
  ];
}
Tips 14 жовтня 2026

`prohibits` - взаємовиключна валідація

Користувач може платити карткою АБО PayPal. Не обома.

Писати кастомну логіку? Є вбудоване правило.

prohibits гарантує, що поле не може бути присутнім разом з іншим.

Коли корисно:

  • Взаємовиключні способи оплати
  • Або email, або телефон
  • Умовні обмеження полів

Схожі правила:

  • required_without — потрібно A, якщо B немає
  • required_with — потрібно A, якщо B є
  • prohibits — A забороняє B

Порада: комбінуйте з required_without для сценарію “або A, або B, але не обидва”.

public function rules()
{
  return [
    'card_number' => 'prohibits:paypal_email',
    'paypal_email' => 'prohibits:card_number',

    'email' => 'required_without:username|prohibits:username',
    'username' => 'required_without:email|prohibits:email',
  ];
}
Tips 12 жовтня 2026

`bail` - зупинити валідацію після першої помилки

У поля email 5 правил. Усі падають — користувач бачить 5 помилок.

Це плутає.

bail зупиняє валідацію поля на першій помилці.

Навіщо:

  • Кращий UX — по одній помилці
  • Продуктивність — не запускаємо дорогі перевірки
  • Чіткіші повідомлення

Як працює:

Додайте bail першим правилом для поля.

Порада: ставте перед дорогими правилами типу exists:, unique: або кастомними перевірками з API.

public function rules()
{
  return [
    'email' => 'bail|required|email|max:255|unique:users',
    'username' => [
      'bail',
      'required',
      'min:3',
      Rule::unique('users')->ignore($this->user),
      new CheckExternalAPI,
    ],
  ];
}
Tips 09 жовтня 2026

`prepareForValidation()` - чистимо дані до валідації

Телефон приходить як "(123) 456-7890", а в БД потрібен "1234567890".

Санітизація в контролері? Це вже запізно.

prepareForValidation() змінює дані запиту до запуску правил.

Коли корисно:

  • Нормалізація телефону
  • Прибирання пробілів
  • Конвертація типів
  • Додавання обчислюваних полів

Важливо:

Виконується до валідації — ідеально для нормалізації.

Порада: merge() додає/оновлює поля, replace() повністю замінює масив даних.

protected function prepareForValidation()
{
  $this->merge([
    'phone' => preg_replace('/[^0-9]/', '', $this->phone),
    'slug' => Str::slug($this->title),
    'price' => (float) $this->price,
    'name' => trim($this->name),
    'email' => strtolower(trim($this->email)),
  ]);
}
Tips 07 жовтня 2026

`exclude()` - прибираємо поля з валідованих даних

У формі є CSRF-токен та допоміжні поля. Ви не хочете, щоб вони потрапили у validated().

exclude_if, exclude_unless прибирають поля умовно.

Коли корисно:

  • Прибрати UI-only поля
  • Виключити поля залежно від ролі
  • Не логувати чутливі поля
  • Тримати валідовані дані “чистими”

Доступні правила:

  • exclude — завжди прибирає
  • exclude_if — прибирає, якщо умова істинна
  • exclude_unless — прибирає, якщо умова хибна
  • exclude_with — прибирає, якщо інше поле присутнє

Порада: краще за ручний unset() після валідації.

public function rules()
{
  return [
    'name' => 'required',
    'admin_notes' => 'exclude', // не потрапить у validated()
    'is_admin' => 'exclude_unless:user.role,admin',
    'card_number' => 'exclude_if:payment_method,cash',
    'paypal_email' => 'exclude_if:payment_method,card',
  ];
}
Tips 05 жовтня 2026

`after()` - хук валідації після проходження всіх правил

Треба перевірити комбінацію полів? Або пов’язані записи в БД?

Звичайні правила працюють незалежно. Хук after() запускається після того, як усі правила пройшли.

Коли корисно:

  • Валідація кількох полів разом
  • Перевірки в БД
  • Складна бізнес-логіка
  • Кастомні повідомлення помилок на основі кількох полів

Суть:

Callback отримує Validator. Помилки додаються вручну.

Порада: after() ідеальний для валідації, що залежить від кількох полів або запитів до БД.

public function withValidator($validator)
{
  $validator->after(function ($v) {
    if ($this->start_date > $this->end_date) {
      $v->errors()->add(
        'end_date',
        'Дата завершення має бути після початку.'
      );
    }

    $total = $this->quantity * $this->price;
    if ($total > 1000 && ! $this->has_approval) {
      $v->errors()->add(
        'has_approval',
        'Замовлення понад $1000 потребують підтвердження.'
      );
    }
  });
}
Tips 02 жовтня 2026

Кастомні правила валідації - коли вбудованих недостатньо

Потрібно перевірити дані через зовнішній API? Або зробити складну перевірку в БД?

Вбудованих правил може не вистачити. Кастомні правила дають повний контроль.

Два підходи:

  • Класи-правила (перевикористовні, тестовані)
  • Closure (швидко, інлайн)

Коли використовувати:

  • Бізнес-специфічна валідація
  • Перевірки через зовнішній API
  • Складні запити до БД
  • Перевірки, що залежать від кількох полів

Порада: для правил, які повторюються в різних формах, краще робити окремий клас-правило.

// Швидко: closure-правило
public function rules()
{
  return [
    'username' => [
      'required',
      function ($attr, $value, $fail) {
        if (strtoupper($value) !== $value) {
          $fail("Поле {$attr} має бути у ВЕРХНЬОМУ регістрі.");
        }
      },
    ],
  ];
}

// Перевикористовно: php artisan make:rule Uppercase
class Uppercase implements Rule
{
  public function passes($attribute, $value): bool
  {
    return strtoupper($value) === $value;
  }

  public function message(): string
  {
    return 'Поле :attribute має бути у верхньому регістрі.';
  }
}
Tips 30 вересня 2026

sometimes() - умовні правила валідації

Email обов’язковий… але лише коли тип користувача — customer.

Писати кастомну логіку валідації в контролері? Неохайно.

sometimes() застосовує правила лише тоді, коли умова істинна.

Як це працює:

  • 1-й аргумент — назва поля
  • 2-й аргумент — правила
  • 3-й аргумент — callback-умова

Коли корисно:

  • Поле обов’язкове залежно від іншого поля
  • Різні правила для різних типів користувачів
  • Складна бізнес-логіка у валідації

Порада: складні умови виносьте в окремі методи для читабельності.

$validator = Validator::make($request->all(), [
  'name' => 'required',
  'type' => 'required|in:customer,guest',
]);

$validator->sometimes(
  'email',
  'required|email',
  fn ($input) => $input->type === 'customer'
);

$validator->sometimes(
  ['phone', 'address'],
  'required',
  fn ($input) => $input->type === 'customer'
);

// Складна умова
$validator->sometimes('company_name', 'required', function ($i) {
  return $i->account_type === 'business'
    && $i->annual_revenue > 100000;
});
Tips 28 вересня 2026

diff() і diffKeys() - пошук відмінностей

Порівнюєте колекції? Потрібно знайти, що додалось або зникло?

diff() порівнює значення, diffKeys() - ключі.

Методи:

  • diff() - порівняння за значеннями
  • diffKeys() - за ключами
  • diffAssoc() - за ключем і значенням

Порада: ідеально, щоб визначити, які дані змінилися між двома наборами.

$original = collect([1, 2, 3, 4, 5]);
$updated = collect([1, 2, 3, 6, 7]);

$removed = $original->diff($updated); // [4, 5]
$added   = $updated->diff($original); // [6, 7]

// diffKeys
$old = collect(['a' => 1, 'b' => 2, 'c' => 3]);
$new = collect(['a' => 1, 'b' => 5, 'd' => 4]);

$keyDiff = $old->diffKeys($new);
// ['c' => 3]

// diffAssoc
$assocDiff = $old->diffAssoc($new);
// ['b' => 2, 'c' => 3]

// Виявлення змін у формі
$originalData = collect($user->toArray());
$updatedData  = collect($request->validated());

$changes = $updatedData->diffAssoc($originalData);

if ($changes->isNotEmpty()) {
  $user->update($changes->toArray());
  Log::info('User updated', ['changes' => $changes]);
}

Вітрина проєктів

Проєкти, створені українською спільнотою на Laravel

Проєкт тижня
Life-Work Balance

Life-Work Balance

Life-Work Balance — застосунок для remote-працівників, які самі собі призначають робочий день. Рахує час на відволікаючих сайтах у межах робочих годин, показує статистику й м'яко блокує сайти після ліміту. Laravel API + Nuxt-дашборд + Chrome-розширення.

Проєкт тижня
Barkme

Barkme

Платформа для моніторингу доступності сайтів і API, стану доменів та SSL-сертифікатів із миттєвими сповіщеннями про збої

Екосистема Laravel

Пакети та інструменти, які прискорять вашу розробку

Laravel Excel

maatwebsite/excel

Імпорт та експорт Excel і CSV поверх PhpSpreadsheet: експорт з колекції чи запиту одним рядком, імпорт із валідацією і чергами для великих файлів. Найпоширеніше рішення для звітів і вивантажень.

12,704 4.0.1 13 4

Filament

filament/filament

Найпопулярніша адмін-панель для Laravel: ресурси, таблиці, форми та дашборди описуються PHP-класами поверх Livewire, Alpine і Tailwind. Замінює рутину CRUD-інтерфейсів декларативною конфігурацією.

31,852 v5.7.6 9

Tinkerwell

tinkerwell.app

Потужний код-раннер та Tinker-інтерфейс для швидкого запуску PHP коду локально або по SSH.

Laravel Docs

laravel.com/docs

Офіційна документація фреймворку від творців.

Перевір свої знання

Пройди інтерактивне тестування та дізнайся свій реальний рівень. Доступні тести для Junior, Middle та Senior розробників.

75 тестів
Junior · Middle · Senior
Публічний результат

Ми в медіа

Публікації про Laravel Ukraine на сторонніх майданчиках

Готові долучитися до спільноти?

Створіть профіль, щоб зберігати статті, відстежувати вакансії та потрапити на карту розробників.