ڈویلپمنٹ لاگ: ڈرائیور سیمز (Seams)، URL بگ، اور DB سیٹنگز

میں نے پورا دن ایک پلیٹ فارم بنانے میں گزارا۔ ایک آرکیٹیکچرل آئیڈیا بار بار سامنے آیا۔ آپ کو اس کام کے درمیان ایک جوڑ (seam) رکھنا چاہیے جو آپ کرتے ہیں اور جہاں آپ ڈیٹا اسٹور کرتے ہیں۔

یہ آپ کو اپنے مین کوڈ کو تبدیل کیے بغیر بعد میں بیک اینڈ (backend) تبدیل کرنے کی اجازت دیتا ہے۔

سیمز کا پیٹرن (The Pattern of Seams)

میں ایک observability پلیٹ فارم بنا رہا ہوں۔ یہ بہت سے ذرائع سے ایررز (errors) اور میٹرکس (metrics) جمع کرتا ہے۔ اسٹوریج کے ہر کام میں ایک ہی پیٹرن پر عمل کیا گیا:

• ایک چھوٹا انٹرفیس (interface) بنائیں (جو کہ ایک معاہدہ یا contract ہو)۔ • ایک Eloquent ڈرائیور (implementation) بنائیں۔

ڈیش بورڈز اور پائپ لائنز صرف انٹرفیس سے بات کرتے ہیں۔ میں فی الحال Postgres استعمال کر رہا ہوں کیونکہ یہ قابل اعتماد ہے۔ اگر مجھے بعد میں کسی تیز رفتار ڈیٹا بیس کی ضرورت پڑی، تو میں صرف ایک نیا ڈرائیور لکھوں گا۔ مجھے اپنے ڈیش بورڈ کوڈ کو تبدیل کرنے کی ضرورت نہیں پڑے گی۔

سبق سادہ ہے: آپ کو پہلے دن دوسرے ڈرائیور کی ضرورت نہیں ہے۔ آپ کو پہلے دن انٹرفیس کی ضرورت ہے۔ ابھی ایک اضافی فائل بنانا بعد میں بڑے پیمانے پر کوڈ دوبارہ لکھنے سے بچاتا ہے۔

تین اچھی عادتیں

• دوہرے آئیڈنٹیفائرز (dual identifiers) استعمال کریں۔ تیز رفتار انٹرنل جوائنز (internal joins) کے لیے auto-increment IDs استعمال کریں۔ ایسی کسی بھی چیز کے لیے UUIDs استعمال کریں جو آپ کے سسٹم سے باہر جاتی ہے، جیسے کہ URLs یا APIs۔ اس سے آپ کے روز کاؤنٹ (row counts) پرائیویٹ رہتے ہیں۔

• Enums استعمال کریں۔ رولز (roles) اور اسٹیٹس (statuses) کو PHP enums میں اسٹور کریں۔ اس سے یہ یقینی بنتا ہے کہ آپ کا UI اور آپ کا لاجک ایک ہی 'سورس آف ٹرتھ' (source of truth) استعمال کریں۔

• اپنے ڈیٹا کو ورژن (version) دیں۔ اپنے پے لوڈز (payloads) میں ہمیشہ ایک ورژن فیلڈ شامل کریں۔ نئے اختیاری (optional) فیلڈز شامل کریں، لیکن پرانے فیلڈز کا نام کبھی نہ بدلیں اور نہ ہی انہیں حذف کریں۔ یہ پرانے کلائنٹس کو خراب ہونے سے بچاتا ہے۔

ٹریکنگ URL کا بگ

مجھے ای میل ٹریکنگ کے ایک پیکیج میں ایک بگ ملا۔ یہ پیکیج کلکس کو ٹریک کرنے کے لیے لنکس کو دوبارہ لکھتا (rewrite) ہے۔ یہ URL کو انکرپٹ کرتا ہے اور پھر ری ڈائریکٹ کے دوران اسے بحال کرتا ہے۔

مسئلہ: Laravel ای میل ٹیمپلیٹس میں لنکس کو HTML-escape کرتا ہے۔ ایک سائنڈ URL (signed URL) میں "&" کریکٹرز استعمال ہوتے ہیں۔ HTML میں، یہ "&" بن جاتے ہیں۔

اگر آپ اس اسکیپ شدہ اسٹرنگ (escaped string) کو انکرپٹ کرتے ہیں، تو "&" URL میں ہی رہ جاتا ہے۔ جب Laravel سگنیچر کو ویلیڈیٹ کرنے کی کوشش کرتا ہے، تو یہ ناکام ہو جاتا ہے کیونکہ اسٹرنگ تبدیل ہو چکی ہوتی ہے۔ یہ صرف سائنڈ URLs کے ساتھ ہوتا ہے، اس لیے اسے ڈھونڈنا مشکل ہے۔

حل: URL کو کیپچر کرنے سے پہلے HTML entities کو ڈیکوڈ (decode) کریں۔

کنفیگ (Config) کے لیے ڈیٹا بیس کا استعمال

میں نے ایڈمنز کے لیے ڈیش بورڈ میں ایپ سیٹنگز تبدیل کرنے کا ایک طریقہ بنایا ہے۔ یہ سیٹنگز ڈیٹا بیس میں ہوتی ہیں، لیکن ایپ اب بھی انہیں اسٹینڈرڈ config() فنکشن کے ذریعے پڑھتی ہے۔

میں AppServiceProvider میں ایک ہلکا سا اوورلے (overlay) استعمال کرتا ہوں۔ یہ ڈیٹا بیس سیٹنگز کو پڑھتا ہے اور موجودہ ریکویسٹ (request) کے لیے انہیں config میں شامل کر دیتا ہے۔ اس سے باقی کوڈ سادہ اور اسٹینڈرڈ رہتا ہے۔

یہاں مشترکہ موضوع 'باؤنڈریز' (boundaries) کا ہے۔ فیصلہ کریں کہ سیم (seam) کہاں لگے گی۔ ایک بار صحیح جگہ پر باؤنڈری لگا دیں۔ باقی سب کچھ سادہ رہے گا۔

ماخذ: https://dev.to/nasrulhazim/dev-log-2026-06-25-driver-seams-everywhere-a-tracking-url-bug-and-db-backed-settings-442l