گزارش توسعه: مرزهای درایور، باگهای URL و تنظیمات پایگاه داده
تمام روز را صرف ساخت یک پلتفرم کردم. یک ایده معماری مدام در ذهنم تکرار میشد: شما باید بین کاری که انجام میدهید و جایی که دادهها را ذخیره میکنید، یک مرز (seam) ایجاد کنید.
این کار به شما اجازه میدهد که بعداً بدون تغییر در کد اصلی، بکاِند خود را عوض کنید.
الگوی مرزها (The Pattern of Seams)
من در حال ساخت یک پلتفرم مشاهدهپذیری (observability) هستم. این پلتفرم خطاها و متریکها را از منابع مختلف جمعآوری میکند. هر وظیفه ذخیرهسازی از الگوی مشابهی پیروی میکرد:
• ایجاد یک اینترفیس کوچک (قرارداد). • ایجاد یک درایور Eloquent (پیادهسازی).
داشبوردها و خطلولهها (pipelines) فقط با اینترفیس در ارتباط هستند. من فعلاً از Postgres استفاده میکنم چون قابل اعتماد است. اگر بعداً به پایگاه داده سریعتری نیاز داشته باشم، فقط یک درایور جدید مینویسم و کد داشبورد را تغییر نمیدهم.
درس ساده است: شما در روز اول به درایور دوم نیاز ندارید، بلکه در روز اول به اینترفیس نیاز دارید. داشتن یک فایل اضافی در حال حاضر، از بازنویسی گسترده در آینده جلوگیری میکند.
سه عادت خوب
• استفاده از شناسههای دوگانه. از IDهای auto-increment برای Joinهای داخلی سریع استفاده کنید. برای هر چیزی که از سیستم شما خارج میشود، مانند URLها یا APIها، از UUID استفاده کنید. این کار باعث میشود تعداد ردیفهای شما خصوصی باقی بماند.
• استفاده از Enumها. نقشها (roles) و وضعیتها (statuses) را در PHP enums ذخیره کنید. این کار تضمین میکند که رابط کاربری (UI) و منطق برنامه شما از یک منبع حقیقت (source of truth) واحد استفاده میکنند.
• نسخهبندی دادهها. همیشه یک فیلد نسخه (version) در پلودهای (payloads) خود بگنجانید. فیلدهای اختیاری جدید اضافه کنید، اما هرگز فیلدهای قدیمی را تغییر نام ندهید یا حذف نکنید. این کار از از کار افتادن کلاینتهای قدیمی جلوگیری میکند.
باگ URL ردیابی
من یک باگ در یک پکیج ردیابی ایمیل پیدا کردم. این پکیج لینکها را برای ردیابی کلیکها بازنویسی میکند. پکیج ابتدا URL را رمزگذاری کرده و سپس در هنگام تغییر مسیر (redirect)، آن را بازیابی میکند.
مشکل اینجاست: Laravel لینکها را در قالبهای ایمیل HTML-escape میکند. یک URL امضا شده (signed URL) از کاراکترهای "&" استفاده میکند. در HTML، این کاراکترها به "&" تبدیل میشوند.
اگر رشتهی escape شده را رمزگذاری کنید، عبارت "&" در URL باقی میماند. وقتی Laravel سعی میکند امضا را تأیید کند، با شکست مواجه میشود زیرا رشته تغییر کرده است. این اتفاق فقط برای URLهای امضا شده میافتد، به همین دلیل پیدا کردن آن دشوار است.
راه حل: قبل از گرفتن URL، HTML entities را رمزگشایی (decode) کنید.
استفاده از پایگاه داده برای تنظیمات (Config)
من راهی ساختم تا مدیران بتوانند تنظیمات اپلیکیشن را در یک داشبورد تغییر دهند. این تنظیمات در پایگاه داده ذخیره میشوند، اما اپلیکیشن همچنان آنها را با استفاده از تابع استاندارد config() میخواند.
من از یک لایه بسیار نازک (thin overlay) در AppServiceProvider استفاده میکنم. این لایه تنظیمات پایگاه داده را میخواند و آنها را برای درخواست فعلی به config تزریق میکند. این کار باعث میشود بقیه کد ساده و استاندارد باقی بماند.
تم اصلی در اینجا «مرزها» است. تصمیم بگیرید که مرز (seam) کجا قرار میگیرد. مرز را فقط یک بار در جای درست قرار دهید. بقیه چیزها ساده باقی خواهند ماند.
