دیجی اسکریپت

یک روتر ساده و حرفه ای در PHP | دیجی اسکریپت

یک روتر ساده و حرفه ای در PHP
[ad_1]

سلام به همه ی دوستان عزیز 😀 امروز یه روتر خوب ساختم و میخوام برای دانلود بزارم تا دوستان عزیز نیز بتونن توی برنامه هایی که مینویسن ازش استفاده کنن. این روتر حجم کمی داره و کدهایی که برای ساختنش نوشته شده زیر ۲۰۰ خط هست!!! اگه نمیدونید روتر چیه میتونید این اموزش رو بخونید(کلیک کنید) تا به استفاده از روتر در برنامه های خودتون علاقمند بشید.

روتری که در اینجا بهتون معرفی میکنم رو میتونید از github (کلیک کنید) یا پایین همین آموزش دانلود کنید و مورد استفاده قرار بدید. نحوه ی استفاده از این روتر نیز به صورت زیر است :

روتر رو دانلود کنید و اگه فشرده هست (zip) از حالت فشرده خارجش کنید. در بین فایل هایی که میبینید سه فایل اصلی وجود داره که به صورت زیر هستند :

فایل htaccess : این فایل باید حتما وجود داشته باشه و باعث میشه تمامی درخواست ها به فایل home.php ارسال بشه.

فایل home.php : این فایل تمامی درخواست ها رو دریافت میکنه و ما این درخواست ها رو با استفاده از روتر مدیریت میکنیم.

فایل ROUTE.php : این فایل روتر شما هست! با استفاده از این روتر میتونید درخواست های خودتون رو مدیریت کنید.

برای استفاده از روتر ابتدا فایل ROUTE.php رو درون فایل home.php اظافه میکنیم کافیه از دستورات زیر استفاده کنید :

<?php
//add router class
include_once 'ROUTE.php';
?>

در بالا با استفاده از دستور include_once روتر رو به فایل home.php اظافه کردیم. تمامی درخواست هایی که داده میشه با استفاده از فایل htaccess به فایل home.php ارسال میشه و ما میتونیم اون رو مدیریت کنیم!

برای مدیریت درخواست ها ابتدا یک سری از متدها و دستورات روتر رو بهتون معرفی میکنم و در مرحله ی بعد چندتا مثال خوب میزنم براتون.

چهارتا تا متد اصلی داریم که به صورت زیر هستن :

  1. متد get : برای دریافت و مدیریت درخواست هایی که به صورت get ارسال میشن استفاده میشه. دقت کنید که در حالت عادی وقتی ما صفحات یک سایت رو بازدید میکنیم متد get هست.
  2. متد post : برای دریافت و مدیریت درخواست هایی که به صورت post ارسال میشن استفاده میشه . متد post بیشتر توی فرم ها (form) بعد از اینکه فرم رو سابمیت (submit) یا ارسال میکنیم استفاده میشه.
  3. متد go : با استفاده از این متد میتونید همه ی درخواست ها رو مدیریت کنید حالا چه به صورت get باشن یا post باشن.
  4. متد addHookFunction : این متد یک تابع رو میگیره و اون رو قبل از همه چیز اجرا میکنه! در مواقعی که میخواید یه کاری رو قبل از اجرای روتر انجام بدید میتونید اون کار رو به متد addHookFunction معرفی کنید تا براتون اجراش کنه.

نکته : تمامی متد های کلاس ROUTE به صورت static تعریف شدن و نیاز نیست که از روی کلاس شی تعریف کنید! اینکار باعث میشه ساده تر بتونید از روتر استفاده کنید.

حالا متدهای بالا رو براتون به همراه مثال تشریح میکنم :

متد های get و post دوتا پارامتر به عنوان ورودی میپذیرن اولیش مسیر یا ادرس مورد نظر , دومیش یک تابع باید باشه که در صورتی که مسیر و متد با درخواست تطبیق داده بشن اجرا میشه. به مثال های زیر دقت کنید:

<?php
//add router class
include_once 'ROUTE.php';

//example 1 : using html or php
ROUTE::get('/login',function(){
//your page
echo '<h1>my login page</h1>';
});
//example 2 : include files
ROUTE::get('/register',function(){
//add your page
include 'pages/register.php';
});
?>

دستورات بالا نحوه ی استفاده از متد get رو شرح میدن! استفاده از متد get و متد post هیچ تفاوتی ندارد فقط بدونید که متد post زمانی اجرا میشه که درخواست شما از نوع post باشه مثلا اگه یک فرم داشته باشید و method اون رو post گذاشته باشید برای نمایش صفحه ی فرم میتونید از متد get استفاده کنید اما برای دریافت و نمایش اطلاعات بعد از ارسال (submit) فرم باید از متد post استفاده کنید.

متد go یک روش کلی تر برای دریافت و مدیریت درخواست ها هست , این متد سه پارامتر قبول میکنه , پارامتر اول نوع درخواست هست که میتونه get یا post باشه , پارامتر دوم مسیر یا ادرس مورد نظر و پارامتر سوم یک تابع است که قراره در صورت تطبیق داده شدن مسیر اجرا شود. به مثال های زیر دقت کنید :

<?php
//example 2 : include files
ROUTE::go('get','/register',function(){
include 'pages/register.php';
});
//for both get and post methods
ROUTE::go('get|post','/logout',function(){
echo '<h1>logout page</h1>';
});
?>

در مثال بالا دوتا روتر تنظیم کردیم اولی در صورتی که ادرس register رو بزنید و درخواست از نوع get باشه صفحه ی شما رو include میکنه تا نمایش داده بشه. دومی در صورتی که ادرس logout رو بزنید یه تگ h1 به شما نمایش میده که توش logout page نوشته شده. دقت کنید که در مثال دوم از get|post استفاده کردیم یعنی اینکه برای هردو نوع درخواست get و post میخواهیم این روتر اجرا شود. علامت | به معنای or کردن هست شما میتونید get|post یا post|get بنویسید که فرقی ندارن!

شما میتونید در پارامتری که قراره ادرس مشخص بشه از regex (عبارات با قاعده استفاده کنید) اگه نمیدونید چی هستن میتونید اینجا رو مطالعه کنید(کلیک کنید). برای استفاده از عبارات با قاعده کافیه از چیزی به صورت {name:regex} استفاده کنید که regex عبارت با قاعده ی مورد نظر شماست و name نامی است که در صورت تطبیق داده شدن regex , چیزی که تطبیق داده شده به صورت متغیر درون name قرار میگیرد و به تابعی که مشخص کردید ارسال میشود. قابلیت استفاده از regex رو میتونید در هر سه حالت get و post و go استفاده کنید. به مثال زیر دقت کنید:

<?php
//using regex
ROUTE::go('get','/show/{id:^d*$}',function($id){
echo '<h1>your numeric id is : '.$id.'</h1>';
});
ROUTE::post('/show/{id:^d*$}',function($id){
echo '<h1>your numeric id is : '.$id.'</h1>';
});
?>

در مثال بالا روش استفاده از regex رو نمایش دادیم. عبارت با قاعده ی ما با مقادیر عددی تطبیق میکند پس در ادرس ما عبارات عددی بعد از show قابل قبول هستند مثلا عبارات زیر قابل قبولن :(برای مثال اینجا کلیک کنید و نتیجه را ببینید- توی ادرس بالای صفحه عدد رو تغییر بدید و بازم ببینید چی میشه)

  1. show/1
  2. show/12321
  3. show/111111111111

شما میتونید از هر regex که دوسدارید استفاده کنید و ازادی عمل داشته باشید.(دستورات regex شما باید بر اساس استاندارد قابل قبول در php باشند).

با استفاده از روتر میتونید ادرس های سایت خودتون رو خوشکل کنید و کار های جالب انجام بدید مثلا میتونید ادرس های سایت خودتون رو به asp تبدیل کنید!!! مثلا به صورت زیر :

<?php
//add router class
include_once 'ROUTE.php';
//change to asp page
ROUTE::get('/login.aspx',function(){
//your page
echo '<h1>my login page</h1>';
});
?>

نتیجه ی مثال بالا رو میتونید از اینجا(کلیک کنید) ببینید. به ادرس بالای صفحه دقت کنید! سایت ما از نوع asp.net شده! این یکی از کارهای جالبی هست که میشه با روتر انجام داد. شما میتونید ادرس صفحات خودتون رو هرجور که دوسدارید بسازید و دستکاری کنید به صورتی که دیگر وابسته به نام فایل ها نیستین.

در اخر به متد addHookFunction هم اشاره میکنم , این متد یک تابع را به عنوان ورودی میپذیرد که به ازای تمامی درخواست ها اجرا میشود. در این متد میتوانید از متغیر data$ استفاده کنید و به درخواست ها دسترسی داشته باشید , از این متد میتوانید در مواقعی که نیاز به ثبت و ضبط درخواست های روتر دارید استفاده کنید.

<?php
//add router class
include_once 'ROUTE.php';
//using add addHookFunction
ROUTE::addHookFunction(function($data){
print_r($data);//show data
});
?>

در مثال بالا یک hook تنظیم کردیم که به ازای تمامی درخواست ها اجرا میشود و متغیر data که شامل درخواست است را نمایش میدهد. به این نکته دقت کنید در صورتی که از addHookFunction استفاده میکنید باید ان را بالاتر از تمامی روتر ها قرار دهید تا قبل از انتها معرفی و اجرا شود.

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

موفق و پیروز باشید.

[ad_2]

لینک منبع مطلب

ارسال دیدگاه جدید

به نکات زیر توجه کنید

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