نوشتهها
از ساخت بکاند با لاراول و PHP چه یاد گرفتم؟
لاراول یکی از ابزارهای حرفهای من در بکاند است؛ از جدا کردن جستوجوی جاجیگا در قالب میکروسرویس تا ساخت مبدل اسناد فارسی در تسمینو. اینجا از تجربهٔ واقعی کار با PHP و Laravel در پروداکشن، از API و عملکرد گرفته تا نگهداری بلندمدت کد میگویم.
لاراول کجا اعتماد من را جلب کرد؟
لاراول را از بیرون راحت میشود دستکم گرفت؛ دمویش آنقدر روان است که بعضیها فکر میکنند اسباببازی نمونهسازی است. تجربهٔ من برعکسش را میگوید: در دو بکاند واقعی — جاجیگا، پلتفرم پرترافیک رزرو اقامتگاه، و تسمینو، پلتفرم رپورتاژ و بکلینک — لاراول ستون قابل اتکای سیستمهایی بود که کسبوکارهای واقعی هر روز رویشان میچرخیدند. PHP و لاراول هنوز کنار FastAPI و جنگو در جعبهابزار حرفهای من هستند و این نوشته دربارهٔ چراییاش است.
قدرت واقعی این فریمورک هیچ قابلیت تنهایی نیست؛ کامل بودن مسیر درخواست تا پاسخ است: مسیریابی، اعتبارسنجی، صف، کش، زمانبندی و ORMای که هم سریع کارت را راه میاندازد هم دیتابیس را از چشمت پنهان نمیکند. وقتی تیم محصول همین ماه API میخواهد و سال بعد سیستمی که بشود نگهش داشت، همین کامل بودن است که جواب میدهد.
اول API، بعد فریمورک
بیشتر کار لاراولی من ساخت API بوده است. درسی که ماند این است: API یک قرارداد است، نه محصول جانبی اسکیمای دیتابیس. در تسمینو APIهایی توسعه میدادم و نگه میداشتم که سرویسهای دیگر مصرفشان میکردند و همین آدم را منظم میکند: اعتبارسنجی دم در ورودی، شکل پاسخِ از پیش فکرشده و اینکه هیچ بازسازی داخلی، بیصدا برای کلاینتی که دست تو نیست تبدیل به تغییر خرابکننده نشود.
لاراول اینجا بیشتر از چیزی که معمولاً به حسابش میگذارند کمک میکند. Form Request اعتبارسنجی را کنار مرز نگه میدارد، Resource پاسخ را عمدی میکند و قراردادهای خود فریمورک یعنی توسعهدهندهٔ تازهوارد بدون راهنما هم پیداش میکند هر رفتار کجا زندگی میکند. من محکم به همین قراردادها تکیه میکنم؛ از لحظهای که کدبیس لاراولی با انتزاعهای «زرنگ» همهجا شروع کند به جنگیدن با فریمورک، دقیقاً همان چیزی را از دست میدهد که لاراول در آن خوب است: واضح بودن.
وقتی مونولیت سنگین میشود: جدا کردن جستوجو در جاجیگا
در جاجیگا مسئله لاراول نبود؛ گرانش بود. جستوجو داغترین مسیر سیستم بود و داخل همان برنامهای زندگی میکرد که همهٔ کارهای دیگر را هم میکرد. زیر ترافیک سنگین، گلوگاههای بکاند و دیتابیس همان مسیر، کل پلتفرم را دنبال خودشان میکشیدند. کار من دو بخش داشت: بهینهکردن کوئریها و مسیرهایی که درد میکردند و بازنویسی قلب جستوجو به شکل یک میکروسرویس مستقل لاراولی که هم سریعتر جواب بدهد هم جدا از بقیه رشد کند.
همین جدا کردن کاربردیترین درس معماری من از لاراول شد: برای رد شدن از سقف مونولیت لازم نیست فریمورک را عوض کنی. سرویس جستوجو لاراول ماند — همان زبان، همان قراردادها، همان دانش عملیاتی — فقط مرز استقرارش جدا شد. کنار تیمهای فرانتاند و زیرساخت، ظرفیت سامانه از حدود ۳٬۰۰۰ کاربر همزمان به بیش از ۵۰٬۰۰۰ رسید. عددش کمتر از شکل راهحل مهم است: آن یک مسیری را که واقعاً داغ است پیدا کن، به آن فضا بده و بقیهٔ سیستم را دست نزن.
همان تجربه خویشتنداری با MySQL را هم یادم داد. بیشتر قصههای «دیتابیس کند است» در واقع «برنامه هزار بار سؤالهای بیخود از دیتابیس میپرسد» است. بهینهسازی کوئری، ایندکس با فکر و Redis جایی که کش واقعاً معنا دارد، بکاند لاراولی را خیلی جلوتر از زیرساختهای عجیبوغریب میبرد؛ کار عملکرد بکاند از نزدیک بیشتر همین شکلی است.
سند، صف و کارهای بیزرقوبرق تسمینو
تسمینو نیمهٔ دیگر بکاند را یادم داد: قابلیتهای بیزرقوبرقی که کسی از آنها اسکرینشات نمیگیرد. آنجا با LibreOffice بدون رابط گرافیکی و Unoconv یک مبدل اسناد اختصاصی ساختم که بین قالبهای HTML و Blade و فایلهای PDF و DOCX تبدیل انجام میداد؛ با پشتیبانی درست از متن فارسی، همانجایی که مبدلهای ساده بیصدا از هم میپاشند.
چنین کاری معیار قضاوتت دربارهٔ فریمورک را عوض میکند. سؤال دیگر «چقدر سریع صفحهٔ CRUD میسازم؟» نیست؛ «این سیستم یک فرایند خارجی عجیب، یک صف، یک فرمت فایل و یک زبان راستبهچپ را چطور هضم میکند بیآنکه اسپاگتی شود؟» است. لاراول هضمش کرد: تبدیل پشت جاب و سرویس نشست، API تمیز ماند و فارسی از یک وصلهٔ همیشگی تبدیل شد به مسئلهٔ مهندسی قابل حل. هر که برای کاربر فارسیزبان بسازد زود میفهمد زبان، فایل ترجمهٔ آخر کار نیست؛ به فونت و جهت متن و عدد و تولید سند میرسد.
کدبیس لاراولی را چطور قابل نگهداری نگه داریم؟
رشتهٔ دیگر کارم در تسمینو بهکار بردن الگوهای طراحی و اصول کد تمیز بود تا کار با کدبیس لاراول راحتتر شود. در عمل یعنی کارهای بیادعا: کنترلر لاغر، مرز سرویس روشن برای بخشهایی که با دنیای بیرون حرف میزنند و مقاومت در برابر وسوسهٔ قایمکردن همه چیز پشت جادو و فساد. لاراول آنقدر طناب میدهد که کدی بنویسی فقط خودت بخوانیاش؛ انضباط یعنی انتخاب کنی این کار را نکنی.
عملیات هم بخشی از نگهداری است. آن بکاندها با Docker، جریان کاری مبتنی بر Git و CI/CD میچرخیدند و مدیریت سرور هم جزئی از کارم بود؛ همان نیمهٔ تحویل و نگهداری که تعیین میکند کدبیس خوب بعد از روبهرو شدن با ترافیک واقعی و لاگ و غافلگیری ساعت سه صبح هم خوب بماند یا نه.
لاراول امروز کجای جعبهابزار من است؟
امروز برای هر شکل مسئله ابزار خودش را برمیدارم: SvelteKit و TypeScript برای پلتفرمهای کنوین، FastAPI و جنگو در پایتون و Rust وقتی سیستم به آن سطح از کنترل نیاز دارد. لاراول جایش را نگه داشته چون تجربه خودش یک قابلیت است؛ وقتی پروژه شکل PHP دارد — API یک کسبوکار، یک پلتفرم محتوایی، تیمی که بعد از من نگهش میدارد — دقیق میدانم زیر بار چطور رفتار میکند، کجا خم میشود و چطور تمیزش نگه دارم.
اگر برای یک بکاند جدی داری لاراول را سبکسنگین میکنی، خلاصهٔ صادقانهٔ من این است: به قراردادهایش احترام بگذار، API را قرارداد بدان، قبل از معماری کوئری را درست کن و سرویس را فقط جایی جدا کن که ترافیک مجبورت کرده باشد. اینها را انجام بدهی لاراول سالها بیسروصدا بار یک کسبوکار را میکشد؛ خودم دیدهام که کشیده است. اگر چنین بکاندی لازم داری، بقیهٔ قصه در رزومهام هست.
