Faragiri

همهٔ زبان‌ها

آموزش لاراول (Laravel) PHP

مدل داده لاراول کوئری‌ها را پنهان می‌کند و همان پنهان بودن است که در یک حلقه به پنجاه‌ویک کوئری تبدیل می‌شود. یک متد جلویش را می‌گیرد.

۴بخش
۳دقیقه خواندن
۴عمق

یک درخواست، شش ایستگاه

از نشانی تا پاسخ، و جایی که کوئری‌ها پنهان می‌شوند

پنج ایستگاه اول پیش از اولین سطر کد شما اجرا می‌شوند، و ایستگاه آخر جایی است که کوئری‌های نانوشته ساخته می‌شوند.

  1. تطبیق مسیربخش داخل آکولاد یک پارامتر است و به آرگومان متد بسته می‌شود
  2. میان‌افزارهانشست، توکن ضدجعل، و در مسیر محافظت‌شده بررسی ورود
  3. حل مدل از روی پارامترسطر با کلید اصلی پیدا می‌شود، و نبودنش همین‌جا پاسخ می‌گیرد
  4. اعتبارسنجیدر کلاس درخواست جدا، پیش از رسیدن به بدنه متد
  5. بدنه کنترلرجایی که فقط باید ترجمه انجام شود و نه منطق
  6. رندر قالبهر خواندن رابطه اینجا یک کوئری تازه است، اگر از پیش گرفته نشده باشد

این مسیر یک درخواست موفق را می‌کشد. تعداد کوئری‌ها در هیچ‌کدام از این ایستگاه‌ها نوشته نشده و فقط با ابزار دیده می‌شود.

یک صفحه که پنجاه سفارش را فهرست می‌کند و برای هر سفارش نام مشتری را نشان می‌دهد. کوئری اول سفارش‌ها را می‌گیرد و بعد، داخل حلقه نمایش، هر بار که نام مشتری خوانده می‌شود یک کوئری تازه زده می‌شود. جمعش می‌شود پنجاه‌ویک کوئری، و در هیچ سطری از کد شما نوشته نشده.

اسم این مسئله بارگذاری تنبل است و راه‌حلش یک متد است که رابطه‌ها را از پیش می‌گیرد. با آن، همان صفحه دو کوئری می‌زند: یکی برای سفارش‌ها و یکی برای همه مشتری‌های مربوط. تفاوت روی صفحه اول یک لپ‌تاپ دیده نمی‌شود و روی سرور اشتراکی همان چیزی است که صفحه را کند می‌کند.

سه چیز که باید بلد باشید تا این را ببینید: نمایش تعداد کوئری‌های هر درخواست در نوار اشکال‌زدایی، فعال کردن حالتی که بارگذاری تنبل را به خطا تبدیل می‌کند، و خواندن خود کوئری‌ها. اولی نشان می‌دهد که مسئله هست و دومی نمی‌گذارد دوباره برگردد.

یک درخواست، از مسیر تا پاسخ

مسیر با Route::get('/sefareshha/{sefaresh}', ...) اعلام می‌شود و بخش داخل آکولاد یک پارامتر است. پیش از رسیدن به متد شما، زنجیره‌ای از میان‌افزارها اجرا می‌شود: نشست بارگذاری می‌شود، توکن ضدجعل بررسی می‌شود، و اگر مسیر محافظت‌شده باشد ورود کاربر هم بررسی می‌شود.

و یک رفتار که وقت زیادی صرفه‌جویی می‌کند: اگر پارامتر متد را با نوع مدل اعلام کنید، فریم‌ورک خودش سطر را با کلید اصلی پیدا می‌کند و به شما می‌دهد، و اگر سطری نباشد پیش از اجرای اولین سطر بدنه متد، پاسخ نبودن منبع را برمی‌گرداند. یعنی بررسی وجود، اصلا در کد شما نوشته نمی‌شود.

سه جایی که نظر فریم‌ورک را باید پذیرفت

مهاجرت‌ها تنها منبع حقیقت ساختار پایگاه داده‌اند و تغییر دستی جدول روی سرور، همان چیزی است که استقرار بعدی را می‌شکند. صف برای هر کاری است که کاربر لازم نیست منتظرش بماند، مثل فرستادن پیامک یا ساختن گزارش. و اعتبارسنجی در کلاس درخواست جدا می‌نشیند و نه داخل کنترلر، چون همان‌جاست که هم قابل آزمون است و هم قابل استفاده دوباره.

پذیرفتن این سه چیز کد را کوتاه می‌کند و مقاومت در برابرشان یعنی نوشتن دوباره چیزی که فریم‌ورک دارد، معمولا با کیفیت کمتر. همان مرزی که در کار با داده در کد مستقل از فریم‌ورک بررسی می‌شود.

جایی که کار گیر می‌کند، هاست اشتراکی است

بیشتر پروژه‌های لاراول در ایران روی هاست اشتراکی مستقر می‌شوند و همان جا با سه مسئله روبه‌رو می‌شوند که در هیچ آموزشی نیست. اول، ریشه وب باید به پوشه عمومی پروژه اشاره کند و نه به ریشه پروژه؛ نکردنش یعنی فایل تنظیمات محیط از اینترنت قابل خواندن است، که جدی‌ترین اشتباه ممکن است. دوم، صف بدون یک فرایند دائمی کار نمی‌کند و روی هاست اشتراکی معمولا چنین چیزی ندارید، پس تنها راه یک کار زمان‌بندی‌شده است. سوم، دستورهای کش پیکربندی و مسیر باید در استقرار اجرا شوند، وگرنه هر درخواست کل پیکربندی را از نو می‌خواند.

ابزار، و سالی که این حرف درست است

در سال ۲۰۲۶ لاراول ۱۲ نسخه‌ای است که یک پروژه تازه رویش ساخته می‌شود و روی PHP 8.4 اجرا می‌شود؛ متن‌باز و رایگان است. برای دیدن کوئری‌های هر درخواست، Laravel Debugbar ابزار جاافتاده است و جای گذاشتن دستی شنونده روی رویدادهای کوئری را گرفته؛ متن‌باز است و فقط در محیط توسعه نصب می‌شود. برای اینکه بارگذاری تنبل اصلا ممکن نباشد، خود فریم‌ورک یک تنظیم دارد که آن را به استثنا تبدیل می‌کند و بهترین جایش محیط توسعه است.

پرسش بعدی این است که آن کوئری‌ها وقتی نوشته می‌شوند چه شکلی دارند و چطور خوانده می‌شوند، که خواندن پلن، و درست کردن کوئری‌ای که توصیفش می‌کند است. و مسیر کامل یک درخواست، مستقل از فریم‌ورک، در درخواست می‌آید، پاسخ می‌رود، و هرچه میان این دو است باز می‌شود.

کنار این

بالای این