وظیفه هر فایل نما طبق مدل MVC دریافت داده های ورودی از طریق فرم های اچ تی ام ال و ارسال آنها به یک کنترل گر و دریافت و نمایش پاسخ از کنترل گر به کاربر است. به عبارت دیگر کاربر از طریق فایل نما با برنامه ها و وب سایت های نوشته شده از طریق فریم ورک لاراول در تعامل است.

هر درخواست نیز از طریق یک مسیر (Route) ارسال می شود. این درخواست ها می توانند یکی از انواع متفاوت درخواست های پروتکل HTTP باشند. به طور معمول درخواست ها از نوع GET و POST هستند. توضیج داده ایم که اگر بخواهیم داده هایی مانند گذرواژه و دیگر داده های شخصی را به سرور و پایگاه داده ارسال کنیم باید از فرم های اچ تی ام ال و متد POST استفاده کنیم.

هر فایل نما شامل تگ های اچ تی ام ال است که ظاهر سایت را به کاربر ارائه می دهد. همانطور که در مطلب های قبلی توضیح دادیم می توانیم از جفت آکولادهای باز و بسته {{}} درون فایل های نما برای نمایش مقدار یک متغیر پی اچ پی استفاده کنیم. در این مطلب و مطلب های بعدی توضیح داده ایم که چگونه از ترکیب تگ های اچ تی ام ال و دستورهای پی اچ پی، یک فایل نما ایجاد کنیم. در واقع Blade ویژگی از لاراول است که اجازه می دهد تا تگ های اچ تی ام ال و دستورهای پی اچ پی را با یکدیگر ترکیب کنیم.

نقش نما در کنار دیگر بخش های مدل MVC

هر فایل نما با پسوند blade.php در مسیر دایرکتوری های resource/views قرار دارد. هر مسیر (Route) باید نام یک فایل نما را بدون پسوند blade.php به عنوان آرگومان اولش فراخوانی کند. فرض کنید می خواهید صفحه تماس با ما را ایجاد کنید پس باید در ساده ترین حالت گام های زیر را انجام دهید:

۱ – ایجاد یک مسیر از نوع متد ()get درون فایل web.php که مسیر آدرس http://127.0.0.1:8000/contact را اداره کند. آرگومان اول متد ()get نام فایل نما مربوط به صفحه ارتباط با ما است.

۲ – ایجاد یک فایل نما به نام contact.blade.php که شامل فرم اچ تی ام ال است که داده ها را از کاربر دریافت می کند. مقدار خصوصیت action این فرم از نوع post است، زیرا توضیح دادیم که چون داده های حساس از طریق فرم های اچ تی ام ال به سرور و پایگاه داده استفاده می شوند، و چون نمی خواهیم کسی از آنها مطلع شود، پس اساسا از متد POST پروتکل HTTP درون فرم های اچ تی ام ال استفاده می کنیم.

۳ – چون فرم اچ تی ام ال در صفحه contact.blade.php داریم و متد استفاده شده POST است، پس باید یک مسیر از نوع متد ()post از کلاس Route را نیز تعریف کنیم که داده های ورودی از طریق فرم اچ تی ام ال را به کنترل گر ارسال می کنند.

۴ – باید درون کنترل گر به داده های ارسالی از طریق فرم اچ تی ام ال دسترسی پیدا کنیم ولی چگونه این کار را انجام دهیم؟ برای این کار باید از یک شی یا نمونه از کلاس Request مطابق مطلب قبلی استفاده کنیم. در مطلب های بعدی به صورت کامل در مورد متدهایی از کلاس Request صحبت می کنیم که کاربرد آنها دسترسی به داده های فرم های اچ تی ام ال است.

۵ – کنترل گر برای آماده سازی پاسخ (Response) ممکن است که با یک مدل ارتباط برقرار کند تا داده های دریافت شده را در غالب یک کوئری به جدول پایگاه داده ارسال کند و پس از دریافت پاسخ (داده ها جدول یا یک خطا)، آن پاسخ را به فایل نما ارسال کند تا به کاربر نمایش داده شود.

از شکل بالا مشخص است که دو فایل welcome.blade.php و about.blade.php درون دایرکتوری views قرار دارند.همچنین دو فایل به نام app.blade.php و navbar.blade.php درون زیر دایرکتوری layouts قرار دارند. بنابراین اگر درون دایرکتوری views زیر دایرکتوری هایی باشد باید از فرم subdir.bladefile برای صدا زدن آنها در نوشتن مسیرها استفاده کنیم.

به طور مثال اگر زیر دایرکتوری به نام admin وجود داشته باشد و درون آن فایلی به نام index.blade.php وجود داشته باشد، باید به صورت admin.index فایل را درون مسیرها و یا هر جای دیگری استفاده کنیم. به طور کلی فرمت subdir.filename در هر کجای برنامه های لاراول باید رعایت شود.

ایجاد محتوای فایل نما

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

ابتدا کدهای زیر را درون فایل welcome.blade.php بنویسد. کد زیر نمونه مثالی است که روش پیش فرض است ترکیب کدهای پی اچ پی و تگ های اچ تی ام ال را نشان می دهد. در واقع در میان تگ های اچ تی ام ال یکباره کدهای پی اچ پی را نوشته ایم. توجه کنید که کدهای پی اچ پی میان php?> و <? قرار گرفته اند و توسط دستور echo یک رشته را نشان می دهند.

در واقع بخش کنترل گر یا منطق برنامه که توسط کدهای پی اچ پی ایجاد می شوند درون بخش نما نوشته شده است که این بر خلاف مدل MVC است. حال فرض کنید که باید دستورهای if یا for و foreach و یا دستورهای تعریف تابع و فراخوانی توابع درونی (Built-in) پی اچ پی را به صورت بالا در میان تگ های اچ تی ام ال بنویسید. این باعث کثیفی و ناخوانایی کد و سخت شدن توسعه و رفع اشکال و بهبود آنها می شود. پس باید از ویژگی های Blade استفاده کنیم.

در کد زیر هم از دو جفت آکولاد باز و بسته و هم از دستور echo استفاده شده است. در واقع استفاده از جفت آکولادهای باز و بسته دقیقا معادل echo است و زمانی که شما متغیری مثلا به نام message$ را میان جفت آکولادهای باز و بسته قرار می دهید، دقیقا معادل استفاده از دستور echo است.

عبارت های Blade

گاهی اواقات لازم است تا درون فایل blade.php و بر اساس یک شرط متغیری را تعریف کنید. همانطور که گفتیم کدهای پی اچ پی باید میان php?> و <? قرار بگیرند ولی چون می خواهیم از Blade استفاده کنیم، پس باید از عبارت های Blade (یا Blade Directive) به جای دستورهای پی اچ پی استفاده کنیم. هر عبارت Blade با علامت @ شروع می شود.

به طور مثال در قطعه کد زیر و در ابتدای فایل blade.php از عبارت php@ و endphp@ استفاده کردیم که به ترتیب معادل کدهای php?> و <? هستند. سپس توسط متد ()is از کلاس Request که به صورت ()Request::is به آن دسترسی پیدا کرده ایم، بررسی کرده ایم که آیا مسیر درخواستی، مسیر ریشه یا root است یا نه؟ اگر مسیر ریشه باشد، پس متغیر path$ با رشته Home Page مقدار دهی می شود در غیر این صورت مقدار متغیر path$ ترکیبی از مقدار برگشتی متد ()Request::path با رشته Page است. همچین توسط تابع ()ucfirst حرف ابتدایی را به بزرگ تبدیل کرده ایم.

توجه کنید حتما باید عبارت endphp@ را برای بسته شدن بخش پی اچ پی استفاده کنید  که در ابتدا با عبارت  php@ شروع شده بود. در مطالب بعدی توضیح داده ایم که می توانیم از عبارت های if@ … @elseif … @else … @endif نیز درون تگ های اچ تی ام ال فایل های Blade استفاده کنید.

همچنین می توانیم میان آکولادهای باز و بسته مقدار برگشتی یک تابع یا متد یک کلاس را نشان دهیم. کدهای زیر درون فایل نما مسیر و آدرس فعلی را در همان صفحه ای نشان می دهد که درخواست از آن ارسال شده است.

ارسال مقدار به فایل نما

در قطعه کدهای بالا و توسط عبارت php@ و endphp@ و بر اساس یک درستی یا نادرستی یک شرط if یک متغیر (داده) را درون خود فایل نما ایجاد کردیم ولی همانطور که در مطلب های پیشین دیدید، داده ها از درون تابع بی نام و یا از درون متد کلاس کنترل گر و از طریق متد ()view به فایل نما ارسال می شوند. آرگومان اول متد ()view نام یک فایل کنترل گر است و آرگومان دوم آن آرایه ای از داده ها است.

در خط های ۱۳ تا ۲۶ از کد بالا آرایه ای به نام userList$ را ایجاد کرده ایم که شامل سه زیر آرایه از نوع آرایه انجمنی هستند. هر یک از زیر آرایه های انجمنی شامل دو کلید به نام های name و age هستند. به طور معمول و البته نه همیشه، این لیست را باید از نتیجه اجرای کوئری SQL بر روی پایگاه داده ایجاد کنیم ولی در اینجا خودمان دستی آنرا ایجاد کرده ایم. در خط ۲۸ در متد ()view آرگومان اول نام فایل نما و آرگومان دوم آرایه انجمنی است که داده ای را مشخص می کند که می خواهیم در نما نشان دهیم.

استفاده از تابع ()compact

در پی اچ پی از تابع ()compact برای ایجاد یک آرایه انجمنی از متغیرهای تعریف شده درون برنامه استفاده می شود. به عبارت دیگر این تابع از یک تا چندین نام متغیر تعریف شده در برنامه را دریافت می کند و سپس به عنوان خروجی آرایه انجمنی را برگشت می دهد که هر کلید آن همنام با نام متغیرها و مقدار هر کلید نیز همان مقدار متغیر متناسب با نام کلید است.

برای درک بهتر قطعه کد زیر مثالی را نشان می دهد.

در خطوط ۲ تا ۴ سه متغیر با مقدار رشته ای ایجاد کرده ایمو در خط ۶ نیز یک متغیر آرایه ای را با مقادیر متغیرهای city$ و stat$ مقدار دهی کرده ایم. سپس در خط ۸ سه رشته را ارسال کرده ایم که رشته event همنام با نام متغیر event$، رشته دوم nothing_here که هیچ متغیر همنامی با آن وجود ندارد و رشته سوم location_vars که معادل با متغیر location_vars$ است به تابع ()compact ارسال شده است و در نهایت توسط تابع ()print_r خروجی را به صورت قابل درک و بهتر خوانده شدن نمایش داده ایم.

همانطور که می بینید خروجی بالا آرایه انجمنی است که دارای سه کلید همنام با سه متغیر خطوط ۲ تا ۴ است. توجه کنید حتی اگر نام متغیر ها را همانند خط ۶ درون یک آرایه قرار دهید (در این مطلب آرایه location_vars$) و سپس خود آرایه را به تابع ()compact ارسال کنید، باز هم نام متغیرهای درون آرایه به عنوان کلید استفاده می شوند.

همچنین دومین ورودی تابع ()compact در مثال بالا یک رشته (در این مطلب nothing_here) و چون نام یک متغیر از پیش تعریف شده نیست، پس کلیدی هم برای آن ایجاد نمی شود. بنابراین ورودی تابع ()compact حتما باید نام یک متغیر باشد. بنابراین از این تابع می توانیم برای ایجاد و ارسال آرایه ای از داده ها به فایل نما استفاده کنیم.

استفاده از تابع ()extract

کاربرد تابع ()extract در مقابل تابع ()compact قرار دارد. این تابع نام یک آرایه انجمنی را دریافت می کند و سپس نام هر کلید را به یک متغیر تبدیل و سپس مقدار کلید را به متغیر انتساب می دهد. آرگومان دوم آن یک گزینه از پیش تعریف شده است. یکی از پر کاربردترین آنها گزینه EXTR_PREFIX_SAME است.

فرض کنید شما نتیجه اجرای یک تابع مانند ()wddx_deserialize را درون یک آرایه ذخیره کرده اید که یکی از کلیدهای این آرایه همنام با یک متغیری است که پیش از این درون برنامه تعریف کرده اید. پس زمانی که تابع ()extract اجرا می شود، پس کلیدهای درون آن باید به یک متغیر نگاشت داده شوند، پس چون از پیش متغیر همنام وجود دارد، خطایی در ایجاد کلید آرایه به متغیر نشان داده می شود، پس لازم است تا گزینه EXTR_PREFIX_SAME استفاده شود.

همانطور که در کد بالا می بینید در خط ۳ متغیر size$ وجود دارد که همنام با کلید size درون آرایه انجمنی است که به تابع ()extract ارسال شده است پس برای جلوگیری از خطای ناشی از متغیرهای همنام، باید گزینه EXTR_PREFIX_SAME با مقدار رشته ای آن، یعنی رشته wddx تعیین شوند تا رشته wddx به عنوان پسوند به نام تنها آن کلیدهایی از آرایه چسبانده شوند که همنام با یک متغیر از پیش تعریف شده هستند.

ارسال تک مقدار با متد ()with

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

لاراول متدی به نام ()with را فراهم کرده است که زمانی استفاده می شود که بخواهید تنها یک متغیر را به فایل نما ارسال کنید و از این رو نمی خواهید یک آرایه را ایجاد کنید. در قطعه کد زیر مثالی از به کار گیری متد ()with نشان داده شده است که در واقع متغیری به نام name$ با مقدار Amir ایجاد می شود که می توانیم آنرا درون فایل نما (در اینجا welcome نام دارد) نشان دهیم.

معرفی PDO در پی اچ پی – نمایش داده ها