Щоденник розробника: Шви драйверів, баги з URL та налаштування БД

Я провів увесь день, розробляючи платформу. Одна архітектурна ідея з'являлася постійно. Ви повинні створити «шов» (seam) між тим, що ви робите, і тим, де ви зберігаєте дані.

Це дозволяє замінити бекенд пізніше, не змінюючи основний код.

Патерн «швів»

Я розробляю платформу для спостережуваності (observability). Вона збирає помилки та метрики з багатьох джерел. Кожне завдання зі зберігання даних виконувалося за одним і тим самим патерном:

• Створити невеликий інтерфейс (контракт). • Створити драйвер Eloquent (реалізацію).

Дашборди та конвеєри (pipelines) взаємодіють лише з інтерфейсом. Зараз я використовую Postgres, тому що він надійний. Якщо пізніше мені знадобиться швидша база даних, я просто напишу новий драйвер. Мені не доведеться змінювати код дашборду.

Урок простий: вам не потрібен другий драйвер у перший же день. Вам потрібен інтерфейс у перший же день. Один додатковий файл зараз запобіжить масштабному переписуванню коду пізніше.

Три корисні звички

• Використовуйте подвійну ідентифікацію. Використовуйте auto-increment ID для швидких внутрішніх об'єднань (joins). Використовуйте UUID для всього, що покидає вашу систему, наприклад, для URL або API. Це дозволить тримати кількість рядків прихованою.

• Використовуйте Enums. Зберігайте ролі та статуси в PHP enums. Це гарантує, що ваш інтерфейс (UI) та ваша логіка використовують єдине джерело істини.

• Версіонуйте свої дані. Завжди додавайте поле версії у ваші корисні навантаження (payloads). Додавайте нові необов'язкові поля, але ніколи не перейменовуйте та не видаляйте старі. Це допоможе уникнути поломок у застарілих клієнтів.

Баг із URL-адресою відстеження

Я знайшов баг у пакеті для відстеження електронних листів. Пакет переписує посилання, щоб відстежувати кліки. Він шифрує URL, а потім відновлює його під час перенаправлення (redirect).

Проблема: Laravel екранує HTML-символи в посиланнях у шаблонах листів. Підписаний URL використовує символи "&". В HTML вони перетворюються на "&".

Якщо ви зашифруєте екранований рядок, "&" залишиться в URL. Коли Laravel намагається перевірити підпис, він видає помилку, оскільки рядок змінився. Це трапляється лише з підписаними URL, тому такий баг важко знайти.

Виправлення: Декодуйте HTML-сутності перед тим, як захоплювати URL.

Використання бази даних для конфігурації

Я створив можливість для адміністраторів змінювати налаштування додатка через дашборд. Ці налаштування зберігаються в базі даних, але додаток все одно зчитує їх за допомогою стандартної функції config().

Я використовую тонку надбудову (overlay) в AppServiceProvider. Вона зчитує налаштування з бази даних і передає їх у config для поточного запиту. Це дозволяє решті коду залишатися простим і стандартним.

Спільна тема тут — межі. Визначте, де має проходити «шов». Розмістіть межу в правильному місці один раз. Все інше залишиться простим.

Джерело: https://dev.to/nasrulhazim/dev-log-2026-06-25-driver-seams-everywhere-a-tracking-url-bug-and-db-backed-settings-442l