در جلسه قبل همانطور که توضیح داده شد توانستیم درخواست هایی که کاربر به سمت برنامه شما ارسال می کنند را کنترل کنیم.

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

در این جلسه قصد داریم دستورات نوشته شده را براساس کلاس و بصورت تفکیک شده و منظم کدنویسی کنیم.

 

بازنویسی فایل index اصلی پروژه

فایل index.php که فایل اصلی اجرا کننده پروژه ما است را قصد داریم بر پایه کلاس و متد بصورت منظم بازنویسی کنیم.

برای شروع این فایل را که در روت اصلی پروژه ما و درون پوشه mvc است باز می کنیم.

مسیر:

از آنجا که این فایل وظیفه تفکیک کنترلر و متد را دارد نام مناسبی برای کلاس آن در نظر می گیریم.در اینجا نام کلاس اصلی را App قرار می دهیم.

مثال:

دو خصوصیت ابتدایی برای کنترلر و متد تعریف می کنیم.

این دو خصوصیت در حالت ابتدایی و زمانی که کاربر وارد هیچ بخشی از نرم افزار ما نشده است دارای مقدار پیش فرض index هستند.

این خصوصیت ها در طول اسکریپت قرار است مقداردهی و تغییر پیدا کنند.

مثال:

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

مثال:

درون تابع سازنده که فراخوانی شده است مقدار GET_$ مربوط به param را که از طریق فایل htaccess دریافت کرده ایم را بررسی می کنیم که آیا مقدار index درون آن وجود دارد یا خیر.

اگر به آدرس “http://localhost/mvc/” بروید و دستور زیر را اجرا کنید مقدار بازگشتی برابر با “array(1) { [“param”]=> string(9) “index.php” }” است و param دارای مقدار index.php است. پس وجود

این مقدار وجود دارد.

مثال:

خوب باید آدرس خود را با استفاده از کاراکتر “/” تفکیک کنیم و تبدیل به آرایه کنیم. وظیفه تفکیک آدرس را به متد دیگری به نام explodeUrl می سپاریم.

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

مثال:

مقدار بازگشتی از متد explodeUrl را به متغیر param$ تخصیص می دهیم.این متغیر حاوی آرایه است.

مثال:

حال شرطی می گذاریم که اندیس نخست این آرایه برابر با index.php نباشد و اندیس اول ما از کنترلر موردنظر شروع شود.

مثال:

حال ما مطمعن شدیم که وارد کنترلر موردنظر خود شده ایم بنابراین مقدار خصوصیت controller$ را برابر با اندیس نخست قرار می دهیم.

مثال:

 

توانستیم کنترلر خود را دریافت کنیم.اما آیا این کنترلر وجود دارد؟

بنابراین باید وجود آن را بررسی کنیم.وظیفه بررسی کلاس و کنترلر را به متد دیگری به نام requireController می سپاریم.این متد بررسی می کند که آیا فایل کنترلر درخواست شده از طریق مرورگر در پوشه Controllers وجود دارد یا خیر؟

در صورتی که کنترلر وجود نداشته باشد مقدار خصوصیت controller$ را برابر با همان مقدار index قرار می دهد و مقدار false برگشت می دهد.

برای بررسی مسیر وجود داشتن یک خصوصیت از نوع const به نام PATHC ایجاد می کنیم که دارای مقدار پیش فرض مسیر کنترلر /Controllers است.

مثال:

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

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

متد getObject:

درون شرط، باز مطمعن می شویم که کاربر تنها وارد کلاس درخواستی شده و با متدهای آن کاری ندارد و در حال حاضر برای مثال تنها کنترلر Admin را فراخوانی کرده است.

برای اطمینان باید تعداد آیتم های متغیر param$ را بررسی و حتما برابر با ۱ باشد.

مثال:

درون تمامی فایل های کنترلر میتوانیم یک متد به نام index ایجاد کنیم تا در صورتی که کاربر وارد کنترلر شد و متدی را درخواست نکرده بود، در صورتی که کلاس، دارای متدی به نام index بود آن را اجرا کند.

برای مثال زمانی که کاربر وارد آدرس “http://localhost/mvc/admin” می شود کلاس Admin در صورت وجود متد index آن را اجرا کند.

نمونه کلاس Admin که دارای متد index است.

مثال:

به سراغ کلاس App می رویم و شرطی را برای بررسی وجود متد index در کلاس درخواستی را وارد می کنیم.

در صورتی که متد index وجود داشته باشد از آبجکت مورد نظر درخواست اجرای آن را می دهیم.اما باید صحت وجود متد درخواستی از طریق آدرس بار مرورگر بررسی کنیم.

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

متد hasMethod دارای پارامتر دریافتی برای دریافت نام متد است و مقدار بازگشتی true یا false است. این متد در دستور شرطی خود از واژه method_exists استفاده کرده است که دارای دو پارامتر است اول کلاس یا آبجکت موردنظر و دوم متد موردنظر درون کلاس یا آبجکت است.

مثال:

 

درخواست متدهای کلاس از طریق مرورگر

تا اینجا توانستیم مطمعن شویم کلاس موردنظر درخواستی ما وجود دارد و در صورت وجود داشتن متد index درون کلاس آن را اجرا می کند.

حال اگر کاربر درخواست متد درون کلاس را بدهد باید آن را بررسی کنیم. برای بررسی تعداد آیتم های متغیر param را چک می کنیم که آیا برابر با عدد ۲ است یا خیر.اگر برابر با عدد ۲ بود خصوصیت methodName را برابر با آیتم شماره دو param قرار می دهیم.پس مقدار methodName برابر با متد است.

حال که متد درخواستی در کلاس درخواست داده شده وجود دارد آن را فراخوانی می کنیم.اما یک سوال؟

آیا متد همیشه بدون پارامتر است؟ نحوه دریافت متد ما بهمراه پارامترها چطور بود؟

همانطور که در جلسه قبل دیدید از از آیتم ۲ به بعد متغیر param مربوط به پارامترهای متد درخواستی است.

برای اجرای متدها درون کلاس App متد جدیدی به نام getMethod ایجاد می کنیم.این متد دارای یک پارامتر است که یک مقدار بولین دریافت می کند. در صورتی که مقدار بولین false باشد یعنی متد درخواستی بدون پارامتر است.درون این تابع از تابع call_user_func را صدا می زنیم.
اما اگر برابر با true باشد یعنی کاربر در آدرس درخواستی علاوه بر متد، پارامتر نیز ارسال کرده است و تابع call_user_func_array را فراخوانی می کنیم.

مثال:

 

اجرای متد کلاس بهمراه پارامترها

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

برای پارامترهای دوم متد getMethod مقادیر slice شدن از آیتم ۲ به بعد را ارسال و اجرا می کنیم.

مثال:

بنابراین اگر متد را در کلاس موردنظر بهمراه پارامتر چه بدون پارامتر ارسال کنیم بدرستی کار خواهد کرد.

برای مثال اگر در مرورگر درخواست آدرس “http://localhost/mvc/admin/sum/20/30” را ارسال کنیم، مقدار بازگشتی برابر با ۵۰ خواهد بود.

اگر در مرورگر درخواست آدرس “http://localhost/mvc/admin/newpost” را ارسال کنیم، مقدار بازگشتی برابر با “the title of post is” خواهد بود.

فایل نهایی کلاس App.php:

دیدگاه خود را بیان کنید

این ایمیل برای عموم منتشر نمی شود