در حالت عادی زمانی که ما در آدرس بار مرورگر خود، درخواستی را وارد و ارسال می کنیم بصورت پیش فرض مرورگر بدنبال پوشه یا فایل مورد نظر در سرور می باشد.
برای مثال زمانی که به مسیر “http://localhost/mvc/views/” می رویم، مقدار “http://localhost/mvc/” مربوط به پوشه اصلی پروژه یا همان دامین است و مقدار “views” پوشه ساخته شده درون mvc است.در انتها نیز فایل “register.php” را فراخوانی کرده ایم. حال بیایم این روند را تغییر دهیم و هر آنچه که در آدرس بار وارد می شود را کنترل کنیم.
برای شروع با یک مثال شروع می کنیم. فرض کنید وارد “http://localhost/mvc/admin” شده ایم که در ورحله اول این پوشه در mvc وجود ندارد و خطای ۴۰۴ می دهد. برای مدیریت آن وارد پوشه Contrllers می شویم و فایل جدیدی به نام “admin.php” می سازیم.
برای مدیریت و کنترل درخواست ها در آدرس بار نیاز به فایلی با نام htaccess. داریم که در روت اصلی پروژه قرار بگیرد و وظیفه آن مدیریت درخواست هایی است که از طریق مرورگر به پروژه ما ارسال می شود.
برای ساخت این فایل وارد روت اصلی پروژه می شویم و راست کلیک کرده و گزینه new file را انتخاب می کنیم.پس از انتخاب از شما درخواست می شود که نامی را برای آن در نظر بگیرید که شما مقدار htaccess. را وارد می کنیم.این فایل نام ندارد بلکه دارای پسوند htaccess است.
درون این فایل باید از دستورات مخصوص مدیریت سرور استفاده کنید.دستورات درون این فایل زیاد هستند اما بسته به کاری که قرار است انجام دهیم از آنها در پروژه خود استفاده می کنیم.قرار نیست همه دستورات را استفاده کنیم.
فواید و کاربردهای فایل htaccess.
- آدرس های درخواست شده به وب سایت یا پروژه خود را کنترل و مدیریت (rewrite) و کاربر را به صفحه موردنظر هدایت کنیم.
- با استفاده از مخفی کردن دایرکتوری های پروژه،از سرقت فایل ها جلوگیری کنیم.
- ایجاد عملیات کش کردن فایل ها و درخواست ها و ..
قبل از شروع کد نویسی باید متوجه کاری که قرار است انجام دهیم بشویم.
ببینید ما باید هر آن چیزی که در آدرس مرورگر چه از طریق خود برنامه چه بصورت دستی توسط کاربر وارد می شود را کنترل کنیم و برای اینکار باید یک الگوی مشخص داشته باشیم و طبق همان عمل کنیم.
برای اینکه یک فایل در کنار و از طریق فایل htaccess وظیفه کنترل درخواست های دریافتی در مرورگر را برعهده داشته باشد و آنها را به کنترلر های موردنظر هدایت کند باید یک فایل به نام “index.php” در روت اصلی پروژه خود ایجاد می کنیم.
پس ما در روت اصلی پروژه یک فایل “htaccess.” و یک فایل “index.php” داریم.
کد نویسی در htaccess.
در این فایل قصد داریم دستورات مربوط به rewrite کردن درخواست های دریافتی را بنویسیم. برای شروع باید موتور rewrite را فعال و روشن کنیم. از دستور RewriteEngine استفاده کرده و مقدار آن را برابر با on قرار می دهیم.
نحوه نوشتن:
1 |
RewriteEngine on |
حال باید الگوی خود را برای هدایت کاربر به قسمت های مختلف وب سایت ایجاد کنیم.
به نحوی که وقتی کاربر مثلا وارد آدرسی به شکل “http://localhost/mvc/admin” می شود فایل “htaccess.” درخواست پس از mvc که روت اصلی پروژه است را به نحوی دیگر در پس زمینه دریافت و مدیریت کند.
همانطور که می دانید یکی از روش های دریافت اطلاعات آدرس بار مرورگر در PHP بصورت عادی استفاده از متغیر عمومی GET_$ است. در این حالت باید مقادیر خود را در قالب کوئری به شکل name=value در آدرس بار وارد کنیم.این مقادیر در PHP با استفاده GET_$ که یک آرایه است قابل دریافت است.
مثال:
1 |
http://localhost/mvc/index.php?name=dejavan.ir |
در مثال بالا به فایل “index.php” که در مسیر “http://localhost/mvc/” وجود دارد، نام name با مقدار “dejavan.ir” ارسال شده است.حال درون فایل “index.php” خود با استفاده از دستور var_dump و میتوانیم مقادیر ارسالی را دریافت کنیم.
مثال:
1 2 3 4 |
<?php var_dump($_GET); ?> //array(1) { ["name"]=> string(10) "dejavan.ir" } |
خوب منظور ما از توضیح دادن دستور GET_$ چه بود و چه ربطی به فایل htaccess. دارد؟
در فایل “htaccess.” باید درخواست ها دریافت شده را مثلا بصورت “http://localhost/mvc/admin” آدرس قابل فهم مثلا شبیه به “http://localhost/mvc/index.php?url=admin” تبدیل کنیم تا بتوانیم آن را کنترل کنیم.
در واقع آدرس “http://localhost/mvc/index.php?url=admin” نماینده آدرس “http://localhost/mvc/admin” است.
به فایل “htaccess.” رفته و دستور RewriteRule را مینویسیم.در جلوی این دستور باید الگوی خود را با استفاده از regular expression وارد کنیم.
برای یادگیری عبارت های باقاعده به دوره در نظر گرفته شده توسط دیزاینر جوان مراجعه کنید.
مثال:
1 2 |
RewriteEngine on RewriteRule ^(.+)$ |
الگو بالا چه چیزی می گوید؟
الگوی بالا درخواست می کند متن شروع شده با هر رشته ای که حداقل یک کاراکتر باشد و با رشته هم تمام شود.
در جلوی عبارت با قاعده خود آدرس موردنظر که نماینده اطلاعات وارد شده است را وارد می کنیم.
مثال:
1 2 |
RewriteEngine on RewriteRule ^(.+)$ index.php?param=$1 |
تست الگوی نوشته شده با htaccess.
بعد از نوشتن rule مورد نظر در فایل htaccess. برای تست در فایل index.php دستور زیر را می نویسیم.
مثال:
1 2 3 |
<?php var_dump($_GET['param']); ?> |
در مرورگر آدرس “http://localhost/mvc/admin” را وارد می کنیم. همانطور که مشاهده می کنید فایل index.php فراخوانی شده و مقدار زیر در خروجی نمایش داده می شود.
خروجی:
1 |
string(9) "index.php" |
حال اگر به جای واژه admin در “http://localhost/mvc/admin” کاراکتری بغیر از حروف و اعداد مثلا * بصورت “http://localhost/mvc/*” وارد کنیم چه اتفاقی می افتد؟
مطمعنا خطای Access forbidden! را مشاهده می کنیم. چرا؟ چون مقدار وارد شده طبق الگوی ^(.+)$ نیست.
اما اینجا یک مشکل وجود دارد و آن این است که هر متنی که در آدرس بار مرورگر وارد می کنیم مقدار index.php نمایش داده می شود و مقدار ۱$ کوئری های ارسال شده در آدرس مرورگر نیست.
هدف ما این است که هر آدرسی که در مرورگر بصورت کوئری وارد می شود را بتوان دریافت کرد.
برای اینکار دستور [QSA,L] را در انتهای دستور خود وارد کنیم. این دستور کوئری را در قالب رشته دریافت کند.
واژه QSA مخفف query,string,append است.
نحوه نوشتن:
1 2 |
RewriteEngine on RewriteRule ^(.+)$ index.php?param=$1 [QSA,L] |
دوباره آدرس “http://localhost/mvc/admin/post” را در مرورگر وارد می کنیم.
خروجی:
1 |
string(10) "admin/post" |
حال که به آدرس خود دسترسی پیدا کردیم می توانیم براساس آن کنترلر و متد موردنظر خود را فراخوانی کنیم.
فراخوانی کنترلر و متد براساس URL درخواستی
همانطور که گفته شد توانستیم با استفاده از htaccess. درون فایل index.php آدرس درخواست شده در مرورگر “http://localhost/mvc/admin/post” را دریافت کنیم.
مقدار بازگشتی فایل index.php یک رشته “admin/post” است. در اینجا admin به کنترلر admin و post به متدی که در کنترلر admin وجود دارد اشاره می کند.
برای جداسازی درخواست ها که بصورت رشته ارسال شده است چه باید کرد؟
برای اینکار باید رشته خود را با استفاده از / درون فایل index.php جدا کنیم.متد این دستور explode است که در پارامتر نخست جداکننده رشته که برابر با “/” و پارامتر دوم رشته مورد نظر که برابر با GET[“param”]_$ است را وارد می کنیم.
مقدار بازگشتی برابر با یک آرایه عددی است.
مثال:
1 2 3 4 5 |
<?php $param = explode('/',$_GET["param"]); var_dump($param); ?> //array(2) { [0]=> string(5) "admin" [1]=> string(4) "post" } |
حال باید مقادیر کنترلر و متد را از هم جدا کنیم.
دریافت مقدار کنترلر
در دستور زیر در متغیر controllName$ مقدار پارامتر نخست param را دریافت کرده ایم.
مثال:
1 2 3 4 |
<?php $param = explode('/',$_GET["param"]); $controllName = $param[0]; ?> |
دریافت مقدار متد کنترلر
در دستور زیر در متغیر methodName$ مقدار پارامتر دوم param را دریافت کرده ایم.
مثال:
1 2 3 4 5 |
<?php $param = explode('/',$_GET["param"]); $controllName = $param[0]; $methodName = $param[1]; ?> |
حال براحتی می توانیم براساس مقادیردریافت شده هر کنترل و متد موردنیاز خود را فراخوانی کنیم.
در مثال زیر با استفاده از متد require_once ابتدا به پوشه Controllers رفته سپس با استفاده از پارامتر نخست متغیر param و کوچک کردن به کنترلر مورد نظر خود دسترسی پیدا کرده ایم.در انتها آن را به پسوند php. متصل کرده ایم.
مثال:
1 2 3 4 5 6 |
<?php $param = explode('/',$_GET["param"]); $controllName = $param[0]; $methodName = $param[1]; require_once "Controllers/".strtolower($controllName).".php"; ?> |
تست درست فراخوانی شدن فایل کنترلر
برای تست به داخل فایل admin.php پوشه Controllers رفته و مقداری را چاپ می کنیم.
مثال:
1 2 3 4 5 6 7 8 9 10 11 12 |
<?php class admin{ public function __construct(){ } public function newPost(){ } } echo "this is admin controllers"; ?> |
سپس در آدرس بار مرورگر وارد مسیر زیر می شویم.
آدرس:
1 |
http://localhost/mvc/admin/post |
همانطور که مشاهده می کنید مقدار “this is admin controllers” نمایش داده می شود.