Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
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]);
}

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Інші поради

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;
});
Завантаження...