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

در برنامه های لاراول هر Route یک درخواست را از کاربر دریافت می کند و سپس این درخواست را به یک کنترل گر واگذار می کند. بنابراین کاربر از طریق درس صفحه تماس با ما درخواستی را کرده است که این درخواست (Request) شامل داده هایی است که از طریق فرم اچ تی ام ال به یک کنترل گر ارسال می شوند. سپس کنترل گر بر اساس کدهای نوشته شده برای آن درخواست را پردازش و احتمالا با بخش مدل (Model) ارتباط برقرار می کند.

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

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

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

تمامی کنترل گرها درون مسیر app/Http/Controllers قرار دارند. هر کنترل گر کلاسی است که از کلاس پایه ای به نام Cotroller مشتق (extend) شده است. توابع (متدهایی) که درون هر یک از این کلاس های کنترل گر تعریف می شوند بخشی از یک واحد منطق برنامه را اجرا می کنند.

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

اما چگونه یک کلاس کنترل گر را پیاده سازی کنیم؟ آیا برای پیاده سازی کلاس کننرل گر نیازی است کد نویسی کنیم؟ توسعه دهندگان لاراول دستور php artisan make:controller را فراهم کرده اند تا بتوانیم یک فایل کنترل گر در مسیر app/Http/Controllers ایجاد کنیم که حاوی کدهای اولیه یک کلاس کنترل گر است.

به طور مثال می خواهیم کلاسی به نام PageController را پیاده سازی کنیم. بنابراین برای ایجاد کلاس PageController باید از دستور زیر استفاده کنید. شکل زیر نشان می دهد که کلاس PageController از کلاس پایه Controller مشتق (extend) شده است.

به طور مثال برای در دستور بالا کلاس کنترل گر PageController را ایجاد کرده ایم که می توانید از شکل زیر محل ذخیره سازی فایل PageController.php و محتوای آنرا مشاهده کنید. همانطور که می بینید کلاس PageController از کلاس پایه ای به نام Controller مشتق شده است، بنابراین در خط سوم شکل فضای نام App/Http/Controllers به فایل ضمیمه شده است.

مشابه مفهوم فضای نام (Name Space) در زبان هایی مانند سی پلاس پلاس، یک فضای نام سازماندهی از چندین کلاس مرتبط به هم است. در واقع اگر به مسیر app/Http/Controlles در شکل بالا نگاه کنید متوجه می شوید که زیر دایرکتوری Controllers درون مسیر app/Http شامل تمامی فایل های کلاس های کنترل گر است به همراه کلاس پایه Controller که این کلاس درون فایل Controller.php تعریف شده است. کد زیر خط سوم شکل زیر را نشان می دهد.

بنابراین کلاس PageController و کلاس پایه Controller هر دو در یک فضای نام و به عبارت دیگر هر دو در مسیر app/Http/Controller قرار دارند. در خط چهارم از شکل بالا کد زیر استفاده شده است. هدف از کد زیر ضمیمه کردن یک کلاس و استفاده از آن، درون فایل pagecontroller.php است.

در واقع Request نام یک کلاس در لاراول است که هدف آن دسترسی و اداره کردن تمامی درخواست های ورودی به لاراول است. همانطور که توضیح داده ایم، یک درخواست از طریق یک مسیر (Route) به لاراول وارد و سپس به یک کنترل گر واگذار می شود و سپس یکی از متدهای تعریف شده درون کنترل گر آنرا پردازش می کند.

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

درون یک کنترل گر لازم است تا این درخواست ها را پردازش و اداره کنیم. به طور مثال فرش کنید فرم اچ تی ام ال را برای ثبت نام در سایت تکمیل و اسال کرده اید. کنترل گری که باید به این درخواست پاسخ دهد، از طریق یک شی یا نمونه از کلاس Request این درخواست را اداره می کند.

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

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

نوشتن متدهای درون کنترل گر

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

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

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

دانلود کد Laravel Controller Intro

شی گرایی در پی اچ پی – نوشتن کلاس

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

شی گرایی در پی اچ پی – متد toString

شی گرایی در پی اچ پی – متدهای get و set

شی گرایی در پی اچ پی – ویژگی ها و متدهای static

شی گرایی در پی اچ پی – فضای نام آموزش دستور namespace و use دراین نوشته