در نوشته لاراول – کنترل گر، نما و Query Builder – بخش یکم بخشی از پروژه آموزشی بسیار ساده برای نمایش و بروز رسانی داده ها را نشان دادیم. کنترل گر UserContoller نام دارد که هر کدام از متدهای آن بخشی از منظق برنامه را پیاده سازی می کنند. گفتیم که با کلیک روی ستون سوم از جدول نمایش کاربران، برگه تازه ای باز می شود که نشانی URL آن شامل شناسه id کاربر همان سطر از جدول است. در کدهای زیر دو متد دیگر از کلاس UserController نشان داده شده است.

مسیرهای درون فایل web.app و متدهای کنترل گر

در فایل web.app از این برنامه ساده، دومین و سومین مسیری که نوشتیم به گونه زیر هستند. همانگونه که می بینید یک مسیر از گونه متدهای ()get و ()post است زیرا می خواهیم بر روی این مسیر هم داده ای را از نشانی URL بدست آوریم، پس باید متد ()get را به کار ببریم. در این زمان متد ()profile از کلاس UserController پاسخ دهنده درخواست است.

متد ()profile کنترل گر

هرگاه که مسیر http://localhost:8000/user/id درخواست شود، متد ()profile از کنترل گر فراخوانی می شود زیر دمین آرگومان فرستاده شده به متد ()get در نخسیتن مسیر کد بالا، به گونه UserController@profile است. این متد یک ورودی به نام id دارد و این همان شناسه ای است که به پایان نشانی URL نوشته شده است. در نوشته  گفتیم که در سومین ستون جدول اچ تی ام ال نمایش کاربران، لینک Edit هست که هرگاه روی آن کلیک کنید، بدست متد ()url نشانی URL برای مسیر {user/{id ساخته می شود.

پس در اینجا و در متد ()profile آرگومان id$ همان شناسه کاربر است که به پایان نشانی URL نوشته شده است و به گونه خودکار به متد فرستاده می شود. پس از دریافت شناسه نخست باید یک پرس و جو برای پیدا کردن کاربری انجام شود که مقدار ستون id آن در جدول برابر با همان شناسه ای باشد که بدست URL به متد ()profile فرستاده شده است. توجه کنید که ستون id در جدول users کلید اصلی است، پس با متد ()find که پیش از این آموزش داده بودیم، می توانیم تک سطری را پیدا کنیم که شناسه آن برابر شناسه ورودی به متد ()profile از نشانی URL باشد.

در گام پسین باید بررسی شود که آیا متغیر user$ خالی است یا نه؟ اگر null نباشد، پس سطری از جدول برگشت داده شده است و از این رو باید سطر پیدا شده را به فایل نما بفرستیم. فایل نما در اینجا profile.blade.php نام دارد و متغیر آرایه ای به نام data$ که دارای یک کلید به نام  user با مقدار متغیر user$ است برای فرستاده شدن به آن آماده شده است.

متد ()abort در لاراول و برگه خطای 404

در متد ()profile اگر سطری پیدا نشود باید خطایی نشان دهیم. در اینجا می خواهیم خطای 404 یا Page Not Found را نشان دهیم. در لاراول برای نمایش یک برگه خطا در مواجه شدن با بروز یک استثنا (Exception) می توانیم متدی به نام ()abort را به کار ببریم. در کد زیر نخست شماره خطای HTTP که در اینجا 404 است دریافت شده و در آرگومان دیگر یک پیغام خطا فرستاده شده است.

فایل نما برای مسیر {user/{id

فایل profile.blade.php شامل داده های است که از متد ()profile در قالب متغیری به نام data$ فرستاده می شود و همچنین شامل فرمی با دو فیلد است که یکی برای تغییر نام کاربر و دیگری برای تغییر آدرس ایمیل آن به کار گرفته می شود. در شکل زیر نخست در بخش title نام کاربری نشان داده می شود که سطر مربوط به آن در قالب متغیر data$ به نما فرستاده شده بود.

متد ()action در لاراول

متد ()action یکی از Helper های درون لاراول است که کاربردی همسان با متد ()url دارد که پیش از این در نوشته لاراول – کنترل گر، نما و Query Builder – بخش یکم آموزش داده ایم. متد ()action برای پدید آوردن نشانی URL از روی نام کنترل گر به کار گرفته می شود. برای نمونه در کد زیر مسیر متد ()index از کلاس HomeController بدست می آید.

در کد بالا متد ()index از کلاس کنترل گر HomeController هیچ پارامتر ورودی را دریافت نمی کند ولی اگر متدی نیاز به ورودی داشته باشد می توانیم این ورودی ها رادر آرگومان دوم به گونه یک آرایه بفرستیم. در کد زیر ورودی id برای متد ()profile از کلاس کنترل گر HomeController فرستاده شده است.

آماده سازی فرم اچ تی ام ال

در شکل بالا می خواهیم به گونه دستی فرم های اچ تی ام ال را پیاده سازی کنیم. برای فرستادن داده ها از فرم های اچ تی ام ال باید متد POST از پروتکل HTTP را به کار ببریم، بنابراین در کد زیر مقدار ویزگی method را برابر با post تعیین کرده ایم. چیز دیگری که می ماند، فایلی است که باید فرم اچ تی ام ال و داده های آن را اداره کند کد این بدست ویژگی action از تگ form نشان داده می شود.

در واقع می خواهیم با مقدار برگشتی متد ()action که خروجی آن مقداری برای ویژگی action در تگ form است بگوییم که کدام متد (در اینجا ()updateUser) از کدام کنترل گر (در اینجا UserController) باید داده های فرستاده شده از فرم را اداره و پردازش کنند. توجه کنید در کد زیر متد ()updateUser از کلاس کنترل گر UserController مسیر از گونه ()post از کلاس Route است زیرا می خواهیم داده های فرم اچ تی ام ال را پردازش کنیم.

بنابراین در پردازش فرم های اچ تی ام ال، هم ویژگی method از تگ اچ تی ام ال باید مقدار post و هم گونه متد مسیر باید از گونه ()post از کلاس Route باشد. همچنین مقدار ویژگی action از تگ form باشد به متدی از کلاس کنترل گر اشاره کند که قرار است داده های فرستاده شده از فرم را دریافت و شاید پردازش و سپس با پایگاه داده ارتباط برقرار کرده و در پایان خروجی را برگشت دهد که این خروجی می تواند یک یا چندین سطر از پایگاه داده یا شاید یک خطا باشد.

کاربرد کنترل گر این است که میان نما (ورودی و درخواست کاربران) و مدل (پایگاه داده) باشد، بنابراین از این رو در متدهای ()index و ()updateUser و ()profile دستورهای Query Builder یا El نوشته می شوند تا درخواست کاربر را پردازش و به پایگاه داده بفرستند و سپس پاسخ را از پایگاه داده دریافت و آن را به فایل نما بفرستند تا به کاربر نمایش داده شود.

متد ()updateUser کنترل گر

کاربرد متد ()updateUser از کلاس کنترل گر UserController این است که با داشتن شناسه کاربر، داده های آن کاربر شامل ستون name و email را بروز رسانی کنیم. این تابع دو شناسه را دریافت می کند، نخست یک نمونه از کلاس Request است که آن را request$ نامیده ایم. دیگری متغیری به نام id است که همان شناسه کارمندی است که می خواهیم با آن درون جدول جستجو کنیم تا کاربری پیدا شود که مقدار ستون id آن برابر با شناسه باشد.

کلاس Request و متدهای ()isMethod و ()input

در شکل نخست همین نوشته می توانید کدهای متد ()updateUser را ببینید. در آن نخست بدست متغیر request$ به متد ()isMethod از کلاس Request دسترسی داریم و بررسی می کنیم که آیا درخواست فرستاده شده به متد ()updateUser از گونه post است یا نه؟ اگر باشد، پس متد ()isMethod مقدار true را برگشت می دهد.

سپس نیاز است تا به مقدار فرستاده شده از فرم ها دسترسی داشته باشیم. برای این منظور باید متد ()input از کلاس Request را به کار ببریم. این متد یک رشته ورودی دریافت می کند که برابر است به مقدار ویژگی name در تگ های اچ تی ام ال که برای هر کدام از تگ های درون تگ form تعیین کرده بودیم. کد زیر دو تگ input در واپسین شکل همین نوشته در فایل profile.blade.php را نشان می دهد. همانگونه که می بینید مقدار ویژگی name این دو تگ input برابر با name و email است، بنابراین برای دسترسی به مقدار این دو تگ در متد ()updateUser باید این دو مقدار به متد ()input از کلاس Request فرستاده شوند.

خط های زیر بخشی از کدهای درون متد ()updateUser را نشان می دهد که بدست متد ()input به مقدار فرستاده شده از دو تگ درون فرم درون فایل نما دسترسی پیدا کرده ایم. بازهم تاکید می کنیم که مقدار فرستاده شده به هر کدام از متدهای ()input، برابر است با مقدار ویژگی name هر یک از تگ های input درون فرم اچ تی ام ال است.

اما ویژگی value از تگ های درون فرم اچ تی ام ال چه کاربردی دارند؟ اگر به دو خط مربوط به تگ های input از فرم اچ تی ام ال که در بالا گفته ایم نگاه کنید، خواهید دید که مقدار برای تگ های value برایهر یک از تگ های input به ترتیب برابر با user->name$ و user->email$ است. اگر به یاد داشته باشید گفتیم که یک متغیر آرایه ای به نام data$ از درون متد ()profile به فایل نما profile.blade.php فرستادیم که دارای یک کلید به نام user بود که مقدار این کلید برابر با متغیری به نام user$ است که مقدار خود این متغیر برابر با تک سطری از جدول بود که این تک سطر برابر با کاربری بود که مقدار ستون id آن در جدول users برابر با شناسه ای بود که از نشانی URL بدست آمده بود.

در فایل profile.blade.php تنها دو تگ input داریم که یکی برای بروز کردن ستون name و دیگری برای بروز کردن ستون email از جدول است و چون شاید نخواهیم یکی از این دو را بروز کنیم، پس یک راهکار این است که برای هر کدام از تگ های درون فرم، ویژگی value آن را با مقدار کنونی بدست آمده مقدار دهی کنیم. به گفته دیگر، user->name به مقدار کنونی نام کاربر اشاره دارد که از متد ()profile بدست آمده بود و با متغیر data$ به فایل نما فرستاده شده است. همین نیز درباره user->email$ صدقمی کند. بنابراین اگر برای یک تگ مقداری برای بروز رسانی تعیین نشود، پس مقدار کنونی آن از ویژگی value در نظرگرفته خواهد شد.

در پایان بدست متد ()update و مقدارهای فرستاده شده از فرم و بدست آمده با متد ()input از کلاس Request، جدول users با شرط برابری ستون id با شناسه ورودی از متد ()updateUser بروز می شود. توجه کنید چندین ایراد در این کدها است، ۱-  آیا کاربر مقداری فرستاده است شاید نخواهیم ویزگی value را به کار ببریم، پس باید از خالی نبودن تگ های فرم اطمینان داشته باشیم. ۲- پر کردن کدام تگ های فرم اختیاری و کدام اجباری است. ۳- آیا داده های فرستاده شده مانند رایانامه، الگوی درست را دارند. این چنین موارد را می توانیم با کتابخانه laravel-form-builder پاسخگو باشیم که در نوشته های پیش رو آموزش داده شده است. واپسین کد درون متد ()updateUser به کارگیری متد ()redirect در لاراول است که در نوشته پسین آن را آموزش داده ایم.