డెవ్ లాగ్: డ్రైవర్ సీమ్స్, URL బగ్స్ మరియు DB సెట్టింగ్స్
నేను రోజంతా ఒక ప్లాట్ఫామ్ను నిర్మించడంలో గడిపాను. ఒక ఆర్కిటెక్చరల్ ఆలోచన పదేపదే తలెత్తింది. మీరు చేసే పనికి మరియు డేటాను నిల్వ చేసే చోటుకి మధ్య ఒక సీమ్ (seam) ఉండాలి.
ఇది మీ ప్రధాన కోడ్ను మార్చకుండానే, తర్వాత మీ బ్యాకెండ్ను మార్చుకోవడానికి అనుమతిస్తుంది.
సీమ్స్ యొక్క ప్యాటర్న్ (The Pattern of Seams)
నేను ఒక అబ్జర్వబిలిటీ ప్లాట్ఫామ్ను నిర్మిస్తున్నాను. ఇది అనేక వనరుల నుండి ఎర్రర్స్ మరియు మెట్రిక్స్ను సేకరిస్తుంది. ప్రతి స్టోరేజ్ టాస్క్ ఒకే ప్యాటర్న్ను అనుసరించింది:
• ఒక చిన్న ఇంటర్ఫేస్ను సృష్టించండి (కాంట్రాక్ట్). • ఒక Eloquent డ్రైవర్ను సృష్టించండి (ఇంప్లిమెంటేషన్).
డాష్బోర్డ్లు మరియు పైప్లైన్లు కేవలం ఇంటర్ఫేస్తో మాత్రమే మాట్లాడుతాయి. ప్రస్తుతానికి నేను Postgres ఉపయోగిస్తున్నాను ఎందుకంటే అది నమ్మదగినది. నాకు తర్వాత వేగవంతమైన డేటాబేస్ కావాలంటే, నేను కేవలం ఒక కొత్త డ్రైవర్ను రాస్తే సరిపోతుంది. నేను నా డాష్బోర్డ్ కోడ్ను మార్చాల్సిన అవసరం లేదు.
దీని నుండి నేర్చుకోవాల్సిన పాఠం సరళమైనది: మొదటి రోజే మీకు రెండో డ్రైవర్ అవసరం లేదు. మొదటి రోజే మీకు ఇంటర్ఫేస్ అవసరం. ఇప్పుడు చేసే ఒక అదనపు ఫైల్, భవిష్యత్తులో భారీగా కోడ్ను మళ్ళీ రాయాల్సిన అవసరం లేకుండా చేస్తుంది.
మూడు మంచి అలవాట్లు
• డ్యూయల్ ఐడెంటిఫైయర్లను ఉపయోగించండి. వేగవంతమైన ఇంటర్నల్ జాయిన్స్ కోసం auto-increment IDs ఉపయోగించండి. URLలు లేదా APIల వంటి మీ సిస్టమ్ నుండి బయటకు వెళ్లే వాటి కోసం UUIDs ఉపయోగించండి. ఇది మీ రో కౌంట్లను (row counts) ప్రైవేట్గా ఉంచుతుంది.
• Enums ఉపయోగించండి. రోల్స్ మరియు స్టేటస్లను PHP enumsలో నిల్వ చేయండి. దీనివల్ల మీ UI మరియు లాజిక్ రెండూ ఒకే సోర్స్ ఆఫ్ ట్రూత్ (source of truth)ను ఉపయోగిస్తాయని నిర్ధారించబడుతుంది.
• మీ డేటాను వెర్షన్ చేయండి. మీ పేలోడ్లలో (payloads) ఎల్లప్పుడూ ఒక వెర్షన్ ఫీల్డ్ను చేర్చండి. కొత్త ఆప్షనల్ ఫీల్డ్లను జోడించండి, కానీ పాత వాటిని ఎప్పుడూ రీనేమ్ చేయవద్దు లేదా తొలగించవద్దు. ఇది పాత క్లయింట్లు పనిచేయకుండా పోకుండా నిరోధిస్తుంది.
ట్రాకింగ్ URL బగ్
నేను ఒక ఈమెయిల్ ట్రాకింగ్ ప్యాకేజీలో ఒక బగ్ను కనుగొన్నాను. క్లిక్లను ట్రాక్ చేయడానికి ఆ ప్యాకేజీ లింక్లను రీరైట్ చేస్తుంది. ఇది URLను ఎన్క్రిప్ట్ చేసి, రీడైరెక్ట్ సమయంలో దానిని తిరిగి పునరుద్ధరిస్తుంది.
సమస్య: Laravel ఈమెయిల్ టెంప్లేట్లలో లింక్లను HTML-escape చేస్తుంది. ఒక సైన్డ్ URL (signed URL) "&" క్యారెక్టర్లను ఉపయోగిస్తుంది. HTMLలో, ఇవి "&"గా మారుతాయి.
మీరు ఎస్కేప్ చేసిన స్ట్రింగ్ను ఎన్క్రిప్ట్ చేస్తే, "&" URLలో అలాగే ఉండిపోతుంది. Laravel సిగ్నేచర్ను వాలిడేట్ చేయడానికి ప్రయత్నించినప్పుడు, స్ట్రింగ్ మారిపోయినందున అది విఫలమవుతుంది. ఇది కేవలం సైన్డ్ URLలకు మాత్రమే జరుగుతుంది, కాబట్టి దీనిని కనుగొనడం కష్టం.
పరిష్కారం: మీరు URLను క్యాప్చర్ చేసే ముందు HTML ఎంటిటీలను (entities) డీకోడ్ చేయండి.
కాన్ఫిగరేషన్ కోసం డేటాబేస్ను ఉపయోగించడం
అడ్మిన్లు డాష్బోర్డ్లో యాప్ సెట్టింగ్లను మార్చుకోవడానికి నేను ఒక మార్గాన్ని రూపొందించాను. ఈ సెట్టింగ్లు డేటాబేస్లో ఉంటాయి, కానీ యాప్ ఇప్పటికీ వాటిని స్టాండర్డ్ config() ఫంక్షన్ ఉపయోగించి చదువుతుంది.
నేను AppServiceProviderలో ఒక సన్నని ఓవర్లే (thin overlay)ని ఉపయోగిస్తాను. ఇది డేటాబేస్ సెట్టింగ్లను చదివి, ప్రస్తుత రిక్వెస్ట్ కోసం వాటిని configలోకి పంపిస్తుంది. ఇది మిగిలిన కోడ్ను సరళంగా మరియు స్టాండర్డ్గా ఉంచుతుంది.
ఇక్కడ ఉన్న ఉమ్మడి అంశం బౌండరీస్ (boundaries). సీమ్ ఎక్కడ ఉండాలో నిర్ణయించుకోండి. బౌండరీని ఒకసారి సరైన చోట ఉంచండి. మిగిలినవన్నీ సరళంగా ఉంటాయి.
