Щоденник розробника: Шви драйверів, баги з 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 для поточного запиту. Це дозволяє решті коду залишатися простим і стандартним.
Спільна тема тут — межі. Визначте, де має проходити «шов». Розмістіть межу в правильному місці один раз. Все інше залишиться простим.
