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

هر Route را می توانیم برای نوع متفاوتی از درخواست های پروتکل HTTP بنویسیم که دو نوع درخواست اصلی و پر استفاده، درخواست های GET و POST هستند. بنابراین درون فریم ورک لاراول، کلاسی به نام Route وجود دارد که این کلاس دارای متدهایی مطابق با درخواست های پروتکل HTTP است.

به طور مثال برای پوشش دادن درخواست GET متد ()get و برای پوشش دادن درخواست POST متد ()post وجود دارند که درون فایل web.php از آنها برای نوشتن مسیرهای دلخواه خودمان استفاده می کنیم. به طور معمول هر یک از متدهای منطبق با درخواست های پروتکل HTTP که درون کلاس Route وجود دارتد، دو آرگومان دریافت می کنند.

آرگومان اول – تعیین مسیر که درخواست از طریق آن وارد می شود

آرگومان اول یک رشته است که مسیری را تعریف می کند که می خواهیم از طریق آن درخواست های کاربر را تعریف کنیم. هر مسیر نوشته شده درون فایل web.php در واقع بیانگر یک URL است که کاربر در مرورگر خود وارد می کند. در واقع آدرس URL که کاربر از طریق آن درخواست صفحه یا فایلی را می کند، به یک Route نوشته شده درون فایل web.php نگاشت داده می شود.

همانطور که توضیح دادیم، کاراکتر / به معنی مسیر ریشه سایت است که معادل به نام دامین یا آدرس سایت می باشد. چون در اینجا ما بر روی هاست محلی لاراول را اجرا می کنیم، پس کاراکتر / معادل با آدرس htpp://127.0.0.1:8000 است. بنابراین هر زمان که شما آدرس htpp://127.0.0.1:8000 را در مرورگر اجرا کنید، پس متدی اجرا می شود که کاراکتر / در آن به عنوان مسیر تعریف شده است.

اما چگونه مسیرهای دیگر را بنویسیم؟ فرض کنید می خواهید صفحه های درباره ما و تماس با ما سایت را تنظیم کنید بنابراین باید به عنوان آرگومان اول مثلا رشته های about و contact را ارسال کنید. پس در حال حاظر دو مسیر زیر را خواهیم داشت.

حال فرض کنید می خواهیم صفحه شخصی هر کاربر را ایجاد کنیم. به عببرای این منظور شاید شما بخواهید صفحه را به صورت profile/username/ تعریف کنید. در ادامه همین مطلب توضیح داده ایم که از طریق مسیرها می توانیم پارامترهایی را از هر نوع دریافت و سپس آنها را به تابع یا کنترل گر ارسال کنیم. بنابراین حالا به طور مثال دو مسیر زیر را داریم.

آرگومان دوم – تابع بی نام یا یک کلاس کنترل گر که درخواست را پردازش می کند

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

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

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

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

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

مثال اول – ایجاد صفحه های درباره ما و تماس با ما

در کدهای زیر سه عدد Route توسط متد ()get نوشته شده است. در پی اچ پی برای دسترسی  و استفاده از  یک متد کلاس بدون ایجاد یک نمونه از آن کلاس، باید از نماد :: استفاده کنیم. پس در کدهای زیر برای دسترسی به متد ()get از کلاس Route از ()Route::get استفاده کرده ایم.

در Route اول مسیر ریشه را تعریف کرده ایم که معادل با آدرس http://127.0.0.1:8000 است. تابع بی نام یک نما را به نام welcome.blade.php برگشت می دهد که درون مسیر resources/views قرار دارد. لطفا فایل welcome.blade.php را باز کنید و کمی محتوای آنرا بررسی کنید. خواهید دید که اساسا چیزی بیشتر از تگ های اچ تی ام ال نیست.

حال می خواهیم دو مسیر http://127.0.0.1:8000/about و http://127.0.0.1:8000/contact را توسط Route های دوم و سوم از کد بالا پیاده سازی کنیم. اما یک تفاوت وجود دارد و آن این است که در توابع بی نام آنها به جای برگشت دادن متد ()view یک رشته برگشت داده شده اند. در تابع بی نام مربوط به مسیر http://127.0.0.1:8000/contact، رشته ای مشتکل از یک تگ input از اچ تی ام ال برگشت داده شده است. دو شکل زیر خروجی مسیرها را نشان می دهد.

ایجاد فایل نما

۱ – هر یک از فایل های نما حتما باید در زیر دایرکتوری resources/views باشند.

۲ – فایل های نما دارای پسوند blade.php هستند.

۳ – فایل های نما می تواند درون زیر دایرکتورهایی در دایرکتوری resources/views باشند. مثلا می خواهیم تمامی نماهای مربوط به بخش پروفایل شخصی در درون داریرکتوری userpanel باشند. به طور مثال در این حالت درون زیر دایرکتوری userpanel یک نما به نام edit_info.blade.php وجود دارد که صفحه ای را نشان می دهد که کاربر از طریق آن اطلاعات شخصی اش را ویرایش می کند. پس درون متد ()view باید به صورت userpanel.edit_info فایل نما را فراخوانی کنیم. به عبارت دیگر اول نام زیر دایرکتوری و سپس نام فایل نما آورده می شود که با یک نقطه از هم جدا شده اند.

۴ – در فراخوانی فایل نما درون متد ()view نیازی نیست که پسوند blade.php را بنویسید، تنها دقت کنید که فایل نام درون دایرکتوری resources/views باشد. اگر فایل نما درون زیر دایرکتوری مانند resources/views/userpanel باشد، دقت کنید که اول نام زیر دایرکتوری و سپس نام فایل نما آورده می شود که با یک نقطه از هم جدا شده اند.

در اینجا می خواهیم صفحه درباره ما به آدرس http://127.0.0.1:8000/about را ایحاد کنیم. برای این کار توسط مرورگر خود و درون دایرکتوری resources/views یک فایل به نام about.blade.php ایجاد کنید. من همان کدهای درون فایل پیش فرض و از پیش ایجاد شده، یعنی welcome.blade.php را درون آن کپی کرده ام اما مطابق با کدهای زیر کمی هم ویرایش کرده ام.

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

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

مثال دوم – دریافت مقدار ورودی

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

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

حال فرض کنید می خواهیم صفحه شخصی هر کاربر را ایجاد کنیم. برای این منظور شاید شما بخواهید صفحه را به صورت {profile/{username تعریف کنید. در ادامه همین مطلب توضیح داده ایم که از طریق مسیرها می توانیم پارامترهایی را از هر نوع دریافت و سپس آنها را به تابع یا کنترل گر ارسال کنیم. بنابراین حالا به طور مثال دو مسیر زیر را داریم.

همانطور که می بینید username نقش یک متغیر را دارد. حال باید یک پارامتر ورودی نیز در تابع بی نام تعریف کنیم. بنابراین به طور مثال اگر مسیر http://127.0.0.1:8000/profile/amirnami را وارد کنیم، پس در واقع رشته ای به نام amir را به آرگومان تابع بی نام ارسال کرده ایم پس می توانیم درون بدنه تابع روی این مقدار ورودی پردازش انجام دهیم.

شکل زیر نشان می دهد که مقداری که در انتهای آدرس URL وارد کرده ایم به تابع بی نام ارسال شده است و سپس در بدنه تابع و توسط تابع ()strtoupper کل کاراکترهای آن به حرف بزرگ تبدیل شده اند ودر نهایت در متغیر name$ ذخیره شده اند.

در متد ()view در آرگومان اول طبق معمول نام یک فایل نما آورده شده است که قاعدتا درون فایل resources/views قرار دارد. آرگومان دوم آرایه انجمنی است که یک جفت کلید و مقدار را تعریف کرده است که مقدار آن همان متغیر name$ است که در یک خط بالا تر ایجاد شده بود. بنابراین می بینید که در آرگومان دوم متد ()view می توانیم یک آرایه انجمنی تعریف کنیم که مقدار یا مقدارهایی را تعیین می کند که می خواهیم به نما ارسال کنیم.

اما چگونه مقدار ارسالی را در نما نشان دهیم

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

توجه کنید که در آرگومان دوم از متد ()view یک آرایه انجمنی تعریف کردیم که کلید آن رشته ای به نام name است و مقدار این کلید متغیری به نام name$ است. البته اجباری به همنام بودن نام کلید و متغیری نیست که به عنوان مقدار آورده شده است. ولی باید توجه کنید آن چیزی در نما، میان جفت آکولادهای بازو بسته، یعنی {{}} قرار می گیرد نام کلید آرایه انجمنی است.

مثال سوم – ویرایش صفحه درباره ما

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

بنابراین می توانیم در مورد جمع بندی ارسال داده در نما موارد زیر را مطرح کنیم.

۱ – باید ازجفت آکولادهای باز و بسته برای نمایش داده ارسالی در نمای مربوط به مسیر استفاده کنیم.

۲ – نام عبارتی که در میان آکولادهای باز و بسته قرار می گیرد، نام کلید آرایه انجمنی است، پس مطابق تکه کد زیر نام کلید یعنی message را به صورت یک متغیر یعنی message$ درون نما و میان جفت آکولادهای باز و بسته قرار داده ایم.

همانطور که می بینید عبارتی که میان جفت آکولادهای باز و بسته آورده شده است، یعنی عبارت <p>{{$message}}</p> را حتی می توانیم میان تگ های اچ تی ام ال قرار دهیم. شکل زیر خروجی جدید صفحه درباره ما به آدرس http://127.0.0.1:8000/about را نشان می دهد.

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

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

اما در آرایه های انجمنی خود برنامه نویس می تواند اندیس ها را و از هر نوعی مشخص کند. به طور مثال در همین مطلب اندیس هایی تعیین کردیم که از نوع رشته بودند. در اصطلاح به اندیس های انجمنی یک کلید (Key) گفته می شود و به هر کلید یک مقدار از هر نوعی اعطا خواهد شد.هر جفت کلید و مقدار در آرایه های انجمنی باید با علامت <= از هم جدا شوند. هر جفت کلید و مقدار با علامت ویرگول از دیگری جدا می شود.

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

دانلود سورس Laravel Write Route