כיצד ליצור מערכת ניתוב פשוטה בצד השרת ב- PHP.

הוקלט על ידי אהרון סקיסמבו

בהקשר של יישום אינטרנט בצד השרת, מערכת ניתוב היא החלק ביישום האינטרנט המקצה בקשת HTTP למטפל בבקשות (פונקציה / שיטה). בקשת HTTP מורכבת מכותרת ראשית ואופציה מגוף. הכותרת מכילה מידע על הבקשה, כגון: ב 'השיטה, הדרך והמארח. שיטות מסוימות כגון GET, HEAD ו- OPTIONS אינן משתמשות בגוף הבקשה, בעוד שאחרות כגון POST, PUT ו- PATCH משתמשות בהן להעברת נתונים מלקוח לשרת.

שימוש במערכת ניתוב מאפשר לנו לבנות טוב יותר את היישום שלנו במקום להקצות כל בקשה לקובץ.

מערכת ניתוב ממפה בקשת HTTP למטפל בקשות על פי שיטת הבקשה והנתיב שצוינו בכתובת ה- URL של הבקשה. זה בדיוק מה שאנחנו הולכים ליצור במדריך זה.

דְרִישָׁה.

  • אתה זקוק ל- PHP גרסה 5 ומעלה כדי לרוץ במחשב הפיתוח שלך.
  • ידע בסיסי ב- PHP, כולל היכרות עם משתנים גלובליים של PHP.
  • הבנה של PHP מונחה עצמים.

כתב ויתור על אחריות.

  • נתב זה מעבד רק בקשות GET ו- POST.
  • לא אשתמש בכלים וספריות מהודרים. אין מלחין, אין טעינה אוטומטית. אני רוצה להמשיך ולהתמקד במושג.
  • בדיקות היחידות הן נהדרות, אבל אני לא אעשה את זה כדי לשמור על הדרכה קצרה. (סליחה מפתחים טובים)
  • הקוד שאני אכתוב אינו קוד מוכן לייצור.

בואו נתחיל.

השתמש במסוף כדי ליצור תיקייה לפרויקט ולהעתיק את התקליטור לתיקיה.

נתב PHP $

צור 4 קבצים בתיקיה כפי שמוצג להלן.

$ touch index.php Request.php IRequest.php Router.php

index.php - זהו קובץ הכניסה ליישום האינטרנט. כאן נתחל את הנתב ונגדיר את המסלולים שלנו. זה כולל גם את כל הייבוא.

Request.php - קובץ זה מכיל מחלקה למחלקה Request לאתחל אובייקטים המכילים מידע אודות בקשת HTTP.

IRequest.php: קובץ זה מכיל את הממשק שעל המחלקה Request ליישם.

Router.php - קובץ זה מכיל את מחלקת הנתב.

לפני שאתה כותב את הנתב, עליך לעצב את ה- API שלו (להשתמש באפליקציות). להלן ה- API של הנתב שלנו.

$ router = נתב חדש;
// כיצד מוגדרים בקשות GET
$ router-> get ('/ some / route', function ($ request) {// הארגומנט $ request של השיחה החוזרת // מכיל מידע על הבקשה להחזרת "תוכן";});
// כיצד מוגדרים בקשות POST $ router-> post ('/ some / route', function ($ request) {// כיצד אוכל לקבל נתונים מגוף הבקשה? $ Body = $ request-> getBody ();}) ;

כעת, לאחר שקבענו כיצד ישתמש בנתב שלנו, בואו ניצור אותו.

צור את מחלקת הבקשה.

ראשית, הגדירו את הממשק המיושם על ידי מחלקת הבקשה הספציפית. הגדר את ממשק IRequest ב- IRequest.php.

getBody () מקבל נתונים מגוף הבקשה. מחלקת הבקשה חייבת להיות מיושמת עבור שיטה זו.

צור את מחלקת הבקשה.

התקשר ל- bootstrapSelf () בבנאי - שיטה שמגדירה את כל המפתחות במערך הגלובלי $ _SERVER כתכונות של מחלקת הבקשה ומקצה את ערכיהם. שיטה זו מכנה את שיטת toCamelCase ().

שיטת toCamelCase () ממירה מחרוזת מארז נחש למארז גמלים.

getBody () הוא יישום של השיטה המוגדרת בממשק IRequest.

צור את מחלקת הנתב.

ב- Router.php, הוסף את הקוד הבא לנתב.

בבנאי הכיתות של הנתב, שמור הפניה לתלות - האובייקט Request.

בואו נשתמש בשיטת הקסם של PHP __call (). שיטה זו מופעלת כאשר קוראים לשיטות בלתי נגישות בהקשר של אובייקט.

שקול את דוגמת הקוד הבאה.

אנו מנסים לקרוא לשיטת get (), שאינה מוגדרת בכיתת הנתב, כך ששיטת הקסם __call () מופעלת. זה מקבל שני ויכוחים. הארגומנט הראשון הוא שם השיטה ('get') והשני הוא מערך של ארגומנטים ששיטת get () מכנה עם ['/', function () {}].

אנו משתמשים בשיטת הקסם __call () כדי ליצור באופן דינמי מערך אסוציאטיבי הממפה שיחות חוזרות למסלולים. אנו יוצרים אחת לכל שיטת בקשה נתמכת. אם נקראת שיטה לא חוקית באובייקט הנתב, אנו מגיבים בשיטת 405, שאינה מותרת.

שיטת resolute () בוחרת בחזרה להתקשרות הנקראת לעיבוד בקשה על בסיס שיטת HTTP ונתיב HTTP של הבקשה ("/", "/ foo / bar" וכו ').

עכשיו שיש לנו את הנתב שלנו נוכל להשתמש בו ליצירת אפליקציה.

צור אפליקציה.

ייבא את מחלקות הבקשה והנתב שהגדרנו לאינדקס.פפ, אתחל נתב והגדר כמה מסלולים.

הפעל את האפליקציה ובדוק אותה ידנית.

השתמש בשרת הפיתוח של PHP להפעלת האפליקציה ביציאה 8000.

במסוף, עבור לתיקיית הפרויקט והפעל את הפקודה הבאה.

$ php -S 127.0.0.1:8000

פתח את דפדפן האינטרנט שלך ונווט אל http: // localhost: 8000 / ו- http: // localhost: 8000 / profile לבדיקת עמוד הבית ודפי הפרופיל.

השתמש בדוור או בתלתל (או בכלי אחר לבחירתך) כדי לבדוק את מסלול ה- POST אל http: // localhost: 8000 / profile.

הנה צילום מסך מהבדיקה שלי עם דוורים.

פוסט / עבודת נתוניםמחק / נתונים מחזירים 405. השיטה אינה מותרת

מחשבות אחרונות.

PHP אינו תומך כרגע בשיטות HTTP המאפשרות שליחת נתונים בגוף הבקשה (למעט POST, PUT, DELETE, PATCH וכו ').

עליך להשתמש ב- php: // קלט (זרם קלט לקריאה בלבד) כדי לקרוא נתונים גולמיים מגוף הבקשה ואז לפרק את הנתונים לזוגות ערך מפתח.

האם אתה צריך לשכור מפתחים מובילים? שוחח עם אנדלה שיעזור לך בכך.