Ларавель

Ларавель часто дає прості інструменти для задач, які з часом стають складнішими, ніж здавалися спочатку. У цій категорії я збиратиму невеликі спостереження з реальної роботи: про Pipeline, сервіси, черги, події, тестування та інші рішення, які допомагають упорядковувати код.

google-oauth-and-email-verification-when-authentication-flows-should-differ.png
Ларавель

Google OAuth і підтвердження email: коли способи входу повинні мати різні сценарії

Парольний вхід і Google OAuth можуть давати різні гарантії щодо email, тому одна перевірка після входу не завжди правильна. Розбираю, коли локальне підтвердження email потрібне, коли його можна не дублювати і чому вимкнене підтвердження email не повинно випадково блокувати OAuth-користувачів.

12
why-unknown-source-does-not-always-mean-your-analytics-is-broken.png
Ларавель

Чому невідоме джерело не завжди означає, що аналітика зламана

Відсутнє джерело переходу не завжди означає втрату даних. Прямий вхід, скопійоване посилання, месенджер, мобільний застосунок або видалений Referer можуть чесно залишити джерело невідомим. Головне - відрізняти об’єктивно невідоме походження від помилки власного відстеження.

16
when-a-read-only-admin-page-should-query-the-settings-table-directly.png
Ларавель

Коли сторінці адмінки краще читати таблицю Settings напряму

Якщо сторінка адмінки лише показує фактичний стан налаштувань, а різні групи зберігаються в одній таблиці, завантаження всіх Settings-класів може бути зайвим. Для режиму лише читання інколи простіше й точніше прочитати таблицю напряму, не перетворюючи цей підхід на обхід правил запису.

32
why-websockets-should-not-be-the-only-source-of-truth-for-unread-notifications.png
Ларавель

Чому WebSocket не повинен бути єдиним джерелом правди для непрочитаних сповіщень

WebSocket добре підходить для миттєвого оновлення інтерфейсу, але подія може бути пропущена. Вкладка могла спати, мережа могла зникнути, ноутбук - прокинутися після паузи. Тому оперативні події варто поєднувати з HTTP-оновленням, яке відновлює фактичний стан.

37
when-a-new-feature-does-not-need-a-new-table.png
Ларавель

Коли новій функції не потрібна нова таблиця

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

38
blocking-an-account-is-more-than-rejecting-the-next-login.png
Ларавель

Блокування облікового запису - це більше, ніж заборона наступного входу

Якщо перевіряти блокування лише під час входу, уже відкриті сесії можуть продовжити працювати. Надійне блокування має враховувати активні сесії, кеш дозволів, захищені запити, історичні дані та правильну поведінку після розблокування.

35
when-total-views-spike-but-deduplicated-views-do-not.png
Ларавель

Коли total views ростуть, а deduplicated views майже ні: це сигнал, а не просто різниця метрик

Різниця між загальною кількістю переглядів і кількістю переглядів без повторів може бути кориснішою за кожен показник окремо. Якщо загальна кількість переглядів різко зростає, а кількість переглядів без повторів майже не змінюється, це привід перевірити, чи не пов’язане таке зростання з повторними запитами або автоматизованою активністю.

73
claiming-pre-registration-data-after-user-signs-up.png
Ларавель

Користувач зареєструвався пізніше: як безпечно прив’язати до нього дані, створені до реєстрації

Гість може створити звернення ще до реєстрації, а після створення облікового запису система має безпечно прив’язати ці дані до нового користувача. Email може бути містком між двома станами, але сам процес має бути захищений від повторного запуску, гонок і помилкового захоплення чужих записів.

60
idempotent-event-listeners-designing-for-safe-retries-in-laravel-cover.png
Ларавель

Idempotent Listener: чому обробник події має витримувати повторний запуск

Queued listener може виконатися повторно після retry, timeout, часткового збою або повторної події. Тому бізнес-операція за listener має бути безпечною при повторному запуску, а друге виконання не повинно створювати дублікати чи повторні side effects.

62
derived-counters-can-drift-build-a-repair-path-cover.png
Ларавель

Похідні лічильники можуть брехати: чому для них потрібен шлях відновлення

Якщо usage_count можна повністю відновити з канонічних зв’язків, він не є джерелом істини. Події можуть загубитися, старий код залишити drift, а міграції обійти звичний flow, тому для похідних лічильників потрібен безпечний шлях повного перерахунку.

61
when-the-event-changes-but-the-old-lifecycle-rule-is-still-in-the-code-cover.png
Ларавель

Подія правильна, а listener вже застарів: як старе lifecycle-rule продовжує жити після зміни вимог

Коли бізнес-вимога змінює момент запуску процесу, недостатньо підключити нову подію. Старі listeners, guards, services і тести можуть і далі непомітно реалізовувати попереднє правило життєвого циклу.

64