در ابتدا یک روتر ساده می نویسیم و در ادامه با Attributeها که در PHP نسخه ی 8 معرفی شدند آن را بازنویسی می کنیم تا با یکی از کاربردی های عملی آن ها آشنا شویم.
به طور خلاصه روتر یا router تمامی درخواست های ورودی را دریافت کرده و در نهایت متناظر با آن قطعه کدی را اجرا می کند.
کلاس زیر را در نظر بگیرید که در ادامه قصد داریم با صدا زدن مسیر / متود index و با صدا زدن مسیر about/ متود about این کلاس اجرا شود.
حال به کلاس Router که نقش مسیریاب را بازی می کند دقت کنید:
این کلاس درون خود یک آرایه به نام routes دارد که مسیرهای تعریف شده را با استفاده از متود register در خود نگهداری می کند.
اصلی ترین کار این روتر را متود resolve به عهده دارد که درخواست های ورودی را به متودهای مورد نظر ما برای اجرا تبدیل می کند. درخواست های ورودی ابتدا تجزیه شده و سپس به متود resolve ارسال می شوند. که در اینجا متود resolve ابتدا بررسی می کند که درخواست ارسالی تعریف شده است یا خیر و در ادامه با استفاده از تابع call_user_func_array آن را اجرا می کند.
برای تجزیه و تحلیل درخواست ورودی می توانیم از کلاسی به شکل زیر استفاده کنیم:
نمونه ای از روتر که مسیرها در آن رجیستر شده اند و همچنین نوع متود HTTP و URI را که از متغیر SERVER_$ گرفته شده را به کلاس App می دهیم و در ادامه با صدا زدن متود run کار تمام است.
کل فایل index ما نیز به شکل زیر خواهد بود:
به راحتی با اجرای دستور زیر می توانید خروجی نهایی کار را با وارد کردن مسیرها در مرورگر مشاهده نمایید:
هدف از ایجاد خصوصیت یا Attribute در PHP این است که به روشی ساخت یافته متادیتا را به کلاسها، متودها، متغیرها و موارد مشابه اضافه کرده و در زمان اجرا با استفاده از Reflection APIها از آن ها استفاده کنیم. شبیه Annotationهایی هستند که در DocBlock برای اضافه کردن متادیتا استفاده می کردیم که در پکیج یا فریمورک معروفی مثل Doctrine و symfony به دفعات دیده می شد.
یکی از معایب استفاده از Annotationها این بود که چون درون کامنت ها جایگذاری می شدند نیاز به پارس شدن داشتند و این علاوه بر سخت کردن استفاده از متادیتاهای پیچیده باعث بوجود آمدن اثرات جانبی هم می شد.
یکی از مثال های استفاده از Annotationها و معادل آن با استفاده از Attributeها را در تصویر زیر مشاهده می کنید:
برای تعریف Attribute به شکل زیر عمل می کنیم:
و برای رجیستر کردن مسیرهای تعریف شده در کلاس HomeController که با اتریبیوت مشخص شده اند یک متود جدید به کلاس Router به شکل زیر اضافه می کنیم:
در اینجا با استفاده از متود getAttributes می توان به راحتی به اتریبیوت های تعریف شده دسترسی پیدا کرد. اگر بدون آرگومان صدا زده شود تمامی اتریبوت هایی که برای متود تعریف شده اند برگشت داده می شود ولی می توانیم مثل حالت فوق که اتریبیوت Route برای آن ارسال شده است عمل فیلتر را انجام داده و فقط اتریبیوت هایی که نیاز داریم را دریافت کنیم. در ادامه با استفاده از متود newInstance می توان به مقادیری که برای آن اتریبیوت تعریف شده اند دست یافت.
و در نهایت فایل index ما نیز به شکل زیر بازنویسی می شود:
این پکیج که برای لاراول توسعه داده شده به شکل پیشرفته ای از Attributeها برای تعریف Route استفاده کرده که می توانید با عمیق شدن در آن درک بهتری به دست بیارید.
امیدوارم براتون مفید بوده باشه
پیروز باشید...