डेव्ह लॉग: ड्रायव्हर सीम्स (Driver Seams), URL बग्स आणि DB सेटिंग्स
मी आजचा दिवस एक प्लॅटफॉर्म तयार करण्यात घालवला. एक आर्किटेक्चरल (architectural) विचार वारंवार समोर आला. तुम्ही जे काम करता आणि जिथे डेटा स्टोअर करता, यांच्यामध्ये एक 'सीम' (seam) असणे आवश्यक आहे.
यामुळे तुमचा मुख्य कोड न बदलता तुम्ही नंतर तुमचा बॅकएंड (backend) बदलू शकता.
सीम्सचा पॅटर्न (The Pattern of Seams)
मी एक ऑब्झर्व्हेबिलिटी (observability) प्लॅटफॉर्म तयार करत आहे. तो अनेक स्रोतांकडून एरर्स (errors) आणि मेट्रिक्स (metrics) गोळा करतो. प्रत्येक स्टोरेज टास्कसाठी एकच पॅटर्न वापरला गेला:
• एक लहान इंटरफेस (interface) तयार करा (तो एक करार किंवा contract आहे). • एक Eloquent ड्रायव्हर तयार करा (ती अंमलबजावणी किंवा implementation आहे).
डॅशबोर्ड्स आणि पाइपलाइन्स फक्त इंटरफेसशी संवाद साधतात. मी सध्या Postgres वापरत आहे कारण ते विश्वसनीय आहे. जर मला नंतर वेगवान डेटाबेस हवा असेल, तर मी फक्त एक नवीन ड्रायव्हर लिहितो. मला माझ्या डॅशबोर्ड कोडमध्ये बदल करण्याची गरज पडत नाही.
धडा साधा आहे: तुम्हाला पहिल्या दिवसापासून दुसऱ्या ड्रायव्हरची गरज नाही. तुम्हाला पहिल्या दिवसापासून इंटरफेसची गरज आहे. आता तयार केलेली एक अतिरिक्त फाईल भविष्यातील मोठ्या कोड रिराईटपासून (rewrite) वाचवते.
तीन चांगल्या सवयी
• ड्युअल आयडेंटिफायर्स (dual identifiers) वापरा. जलद अंतर्गत जॉइन्ससाठी (internal joins) auto-increment IDs वापरा. तुमच्या सिस्टमबाहेर जाणाऱ्या कोणत्याही गोष्टीसाठी, जसे की URLs किंवा APIs, UUIDs वापरा. यामुळे तुमच्या रो काउंट्स (row counts) खाजगी राहतात.
• Enums वापरा. रोल्स (roles) आणि स्टेटस (statuses) PHP enums मध्ये स्टोअर करा. यामुळे तुमचे UI आणि लॉजिक एकाच 'सोर्स ऑफ ट्रुथ'चा (source of truth) वापर करतील याची खात्री मिळते.
• तुमच्या डेटाला व्हर्जन (version) करा. तुमच्या पेलोड्समध्ये (payloads) नेहमी एक version फील्ड समाविष्ट करा. नवीन पर्यायी (optional) फील्ड्स जोडा, परंतु जुन्या फील्ड्सना कधीही नाव बदलू नका किंवा काढून टाकू नका. यामुळे जुन्या क्लायंट्सना (clients) अडथळा येत नाही.
ट्रॅकिंग URL बग (The Tracking URL Bug)
मला एका ईमेल ट्रॅकिंग पॅकेजमध्ये एक बग सापडला. हे पॅकेज क्लिक्स ट्रॅक करण्यासाठी लिंक्स पुन्हा लिहितो (rewrites). ते URL एन्क्रिप्ट करते आणि नंतर रिडायरेक्ट दरम्यान ते पुन्हा मूळ स्वरूपात आणते.
समस्या: Laravel ईमेल टेम्पलेट्समधील लिंक्स HTML-escape करते. 'signed URL' मध्ये "&" कॅरेक्टर्स वापरले जातात. HTML मध्ये, हे "&" मध्ये बदलतात.
जर तुम्ही एस्केप केलेल्या स्ट्रिंगला (escaped string) एन्क्रिप्ट केले, तर "&" URL मध्येच राहते. जेव्हा Laravel सिग्नेचर व्हॅलिडेट करण्याचा प्रयत्न करते, तेव्हा स्ट्रिंग बदलल्यामुळे ते अयशस्वी होते. हे फक्त signed URLs सोबतच घडते, त्यामुळे ते शोधणे कठीण असते.
उपाय: URL कॅप्चर करण्यापूर्वी HTML entities डिकोड करा.
कॉन्फिगसाठी (Config) डेटाबेसचा वापर करणे
मी ॲडमिन्सना डॅशबोर्डमध्ये ॲप सेटिंग्स बदलण्यासाठी एक मार्ग तयार केला आहे. या सेटिंग्स डेटाबेसमध्ये असतात, परंतु ॲप अजूनही त्यांना मानक config() फंक्शन वापरून वाचते.
मी AppServiceProvider मध्ये एक पातळ ओव्हरले (thin overlay) वापरतो. ते डेटाबेस सेटिंग्स वाचते आणि सध्याच्या रिक्वेस्टसाठी त्यांना config मध्ये पुश करते. यामुळे उर्वरित कोड साधा आणि मानक राहतो.
येथे मुख्य विषय 'बाउंड्रीज' (boundaries) हा आहे. सीम (seam) कुठे असावी हे ठरवा. एकदा योग्य ठिकाणी बाउंड्री सेट करा. बाकी सर्व काही सोपे राहते.
