در مطلب معماری MVC در لاراول ۵.۷ توضیح دادیم که کنترل گر ها (Controllers) کلاس هایی هستند که از کلاس پایه ای به نام Controller مشتق شده اند. هر کنترل گر واسطه ای میان کاربر و برنامه تحت وب یا وب سایت است. در واقع کاربر از طریق بخش نما (View) و فرم های اچ تی ام ال درخواست خود را تحویل یک کنترل گر می دهد و سپس کنترل گر که به عنوان منطق برنامه است، درخواست را پردازش می کند.

ممکن است مقدارهای ارسالی از طریق فرم را اعتبار سنجی کند. به طور مثال آیا فرمت آدرس ایمیل درست است و ایا تمامی آن فیلدهای لازم و اجباری پر شده باشند. در نهایت ممکن است با یک مدل (Model) ارتباط بر قرار کند. مثلا لازم است تا فهرست تمامی محصول ها را بخواهیم، پس کنترل گر درخواست را به مدل مربوط به محصول ها تحویل می دهد، مدل کوئری را بر روی جدول یا حتی جدول هایی انجام داده، سپس سطرهای بدست آمده را تحویل کنترل گر می دهد و نهایت کنترل گر نتیجه را تحویل یک نما می دهد؟

تا به اینجا وظیفه هر یک از سه بخش مدل MVC مشخص شده است ولی یک برنامه تحت وب یا وب سایت نوشته شده توسط لاراول چگونه یک درخواست را دریافت می کند؟ پاسخ به این سوال مفهومی به نام Route یا مسیرها است.

هر مسیر (Route) معادل یک URL است. به طور مثال مسیر ریشه (Root) مسیری است که تنها شامل نام دامنه یا آدرس سایت یا برنامه تحت وب می شود. به طور مثال مسیر https://dataset-academy.com، مسیر ریشه است اما دیگر مسیرهایی هم وجود دارند.

همه مثال های بالا و هر نوع URL دیگر از جمله مثال های یک مسیر (Route) یا URL هستند. بنابراین نخستین کاری که باید انجام دهیم، ایجاد و تعریف مسیرها در برنامه های لاراول هستند ولی باید چند مورد زیر را پیشاز تعریف مسیرها در نظر بگیرید:

۱ – مسیرها را در کدام فایل تعریف کنیم.

۲ – نوع درخواست (Request) ارسالی به مسیر ازکدام نوع از درخواست های پروتکل HTTP است.

۳ – کدام نما باید در قبال درخواست نمایش داده شود.

۴ – کدام کنترل گر پاسخگو و پردازش کننده درخواست ورودی به سایت است که از طریق مسیر (Route) دریافت شده است.

فایل web.php برای تعریف مسیرها

هر مسیر درون لاراول به صورت پیش فرض درون فایل web.php در زیر دایرکتوری routes (یعنی routes/web.php) تعریف می شود. مسیرها بر اساس نوع درخواست می تواند توسط یکی از متدهای زیر از کلاس Route ایجاد شوند.

در فایل web.php به صورت پیش فرض کد زیر وجود دارد. کد زیر سه مطلب را مشخص می کند:

۱ – نوع درخواست ورودی که تنظیم کرده ایم از نوع درخواست GET پروتکل HTTP است.

۲ – آدرس URL که می خواهیم برای آن مسیر تعریف کنیم، آدرس ریشه سایت است، زیرا کاراکتر / را به عنوان آرگومان اول به متد get از کلاس Route ارسال کرده ایم. به یاد داشته باشید کاراکتر / معرف مسیر ریشه سایت است.

۳ – آرگومان سوم یک تابع بی نام (Anonymous Function) است. توابع بی نام شبیه توابع معمولی هستند ولی هیچ نامی به آنها اعطا نمی شود. هدف از تابع های بی نام استفاده از آنها به عنوان یک Callback است. در زبان های یک Callback شبیه توابع معمولی هستند با این تفاوت که یک تابع معمولی را دستی خودمان فراخوانی می کنیم ولی Callback ها به صورت خودکار و در صورت بروز یک درخواست توسط خود برنامه فراخوانی می شوند.

در واقع تابع بی نام یا همان Callback که به عنوان آرگومان دوم به تابع ارسال شده است، نقش کنترل گر را ایفا می کند. اما تک خط کد درون تابع بالا چه کاری را انجام می دهد؟ کار این کد فراخوانی متدی به نام ()view است که نام یک فایل نما را به عنوان آرگومان اول دریافت کرده است.

پیش از این توضیح داده ایم که تمامی فایل های نما که شامل کدهای اچ تی ام ال هستند درون فایل هایی با پسوند blade.php ذخیره می شوند و این فایل ها در زیر دایرکتوری resources/views قرار دارند. بنابراین چون نام آرگومان ارسالی به متد ()view رشته ای به نام welcome است، پس قاعدتا یک فایل به نام welcome.blade.php در زیر دایرکتوری resources/views قرار دارد.

بنابراین در کد بالا و توسط متد ()get، برای مسیر ریشه سایت که با علامت / مشخص شده است یک Route ایجاد کرده ایم. زمانی که کاربر در مرورگر آدرس سایت را وارد کند، باید تابع بی نام یا Callback در آرگومان دوم فراخوانی شود که خود این تابع یک نما به نام welcome را فراخوانی می کند که در واقع به فایل welcome.blade.php در زیر دایرکتوری resources/views اشاره دارد.

اجرای برنامه و آزمایش مسیر نوشته شده

بنابراین پس از اینکه پروژه را ایجاد کردیم به صورت پیش فرض و مطابق با کد بالا یک Route در زیر دایرکتوری routes و در فایل web.php وجود دارد. هدف آن نوشتن مسیری برای پاسخ دادن به درخواست هایی است که از طریق مسیر ریشه به وب سایت ارسال می شود.

برای اجرا کردن پروژه و آزمایش مسیر نوشته شده، باید در خط فرمان و درون دایرکتوری پروژه قرار داشته باشد و سپس دستور زیر را اجرا کنید. پس از اجرای دستور یک آدرس به صورت http://127.0.0.1:8000 ایجاد می شود. در واقع این آدرس همان مسیر ریشه سایت است که کاراکتر / به آن اشاره دارد. لاراول به صورت پیش فرض بر روی پورت ۸۰۰۰ به درخواست های ورودی گوش می دهد. آدرس http://127.0.0.1:8000 را در مرورگر اجرا کنید تا نتیجه شکل زیر را ببینید.

تغییر کوچک در کد بالا

در قطعه کد زیر ابتدا یک متغیر به نام rootCallback تعریف کرده ایم که مقدار آن یک تابع بی نام است. این تابع دقیقا همان کاری را می کند که در کد اول دیدیم، یعنی یک فایل نما را توسط متد ()view فراخوانی می کند. اما اگر دقت کنید خواهید دید که در خط ۵ نام متغیر را در آرگومان دوم آورده ایم.

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

در واقع آدرس مسیر ریشه که در اینجا همان http://127.0.0.1:8000 است به عبارت کاراکتر / نگاشت داده می شود و سپس تابع بی نام مورد نطر در آرگومان دوم فراخوانی و در نهایت فایل نما مورد نظر به عنوان پاسخ به کاربر نمایش داده می شود.

تعریف متغیرها و نمایش مقدار آنها در پی اچ پی

تعریف تابع بی نام در پی اچ پی

استفاده از کنترل گر ها به جای تابع بی نام

همانطور که گفتیم در مدل MVC کنترل گرها درخواست کاربر را دریافت و واکنش مناسب را انجام می دهند. در کدهای بالا ما از توابع بی نام استفاده کرده ایم. اما گفتیم که کاربر از طریق یک URL که به عنوان یک مسیر (Route) در لاراول تعریف شده است، درخواست خود را تحویل یک کنترل گر می دهد.

بنابراین در مطلب های بعدی توضیح داده ایم که چگونه و توسط مجموعه دستورهای  artisan یک کنترل گر را تعریف و سپس متدهایی را در آنها تعریف کنیم که هر یک از این متدها متصل به یک مسیر می شود و یک درخواست خاص را پردازش می کند. اما در این مطلب و برای درک بهتر بازهم کد مسیر پیش فرض درون فایل web.php را تغییر می دهیم. در واقع می خواهیم یک مسیر جدید را ایجاد کنیم.

اولا در کد بالا چون از متد ()get استفاده کرده ایم، پس نوع درخواست از نوع درخواست GET از پروتکل HTTP است. دوما می خواهیم درخواست ها برای مسیر index/ تنظیم شده اند. همانطور که گفتیم کاراکتر / به معنی مسیر ریشه است، پس مسیر index/ به معنی و معادل مسیر http://127.0.0.1:8000/index است.

همچنین توضیح دادیم قاعده نامگذاری کلاس کنترل گرها به این صورت است که در انتهای نام کنترل گر رشته Controller قرار می گیرد، پس چون نام کنترل گر ما HomePage است، پس نام کلاس و نام فایل آن که در زیر دایرکتوری app/Http/Controllers می آید به صورت HomePageController خواهد بود.

همانطور که گفتیم هر متد از کلاس کنترل گر یک درخواست را پردازش می کند. به طور مثال اگر کاربر مسیر http://127.0.0.1:8000/index را در مرورگر وارد کند، پس متد ()index از کلاس HomePageController پاسخ آنرا می دهد.

در مطلب های بعدی بیشتر در مورد انواع درخواست های HTTP، نوشتن مسیرهای دلخواه و چگونگی ایجاد کنترل گرها صحبت کرده ایم. همچنین توضیح داده ایم که چگونه مقادیر و داده ها را میان کنترل گرها و نماها انتقال دهیم.

بنابراین اگر نخواهیم از کنترل گرها استفاده کنیم و در عوض از تابع بی نام استفاده کنیم، قطعه کد بالا را می توانیم به صورت زیر بازنویسی کنیم.

دانلود کد Laravel Route Intro