טיולי מצרים
טיולי מצרים — פלטפורמת חוויות גלובלית אספקת חוויות טיול ותיירות עם יחס המרה גבוה, תוך התמקדות ב-SEO והנדסה ברמה ארגונית למהירות, אמינות ולוקליזציה.
טיולי מצרים — פלטפורמת חוויות גלובלית
אספקת חוויות טיול ותיירות עם יחס המרה גבוה, תוך התמקדות ב-SEO והנדסה ברמה ארגונית למהירות, אמינות ולוקליזציה.
מאגר זה מכיל אפליקציית Laravel מוכוונת ייצור המניעה פלטפורמת תיירות רב-לשונית ורב-מטבעית. היא פותרת את הבעיה האמיתית של תפעול מלאים גדולים של מוצרי תיירות הטרוגניים (טיולי יום, חבילות, שייט) על ידי מתן:
- קטלוג מוצרים מהיר וניתן לסינון, המותאם לשאילתות בעלות השהיה נמוכה וחיפושים מורכבים.
- מנוע תמחור והזמנות גמיש התומך בתמחור לפי טווחי תאריכים, וריאציות של חדרים/קבינות, ומדיניות תמחור לילדים.
- לוקליזציה מלאה (תרגום שפות ו-Slugs) והמרת מטבע עבור קהלים גלובליים.
הצעת ערך מרכזית ודגשי שיווק
-
ביצועים ומדרגיות: הפלטפורמה בנויה על Laravel 12 ומותאמת לקנה מידה עם דנורמליזציה אסטרטגית (טבלת
product_filters), מטמון ידידותי ל-Redis בשירותים כמוCurrencyService, ואריזת Frontend מבוססת Vite. אגרגציות כבדות מחושבות מראש בזמן הכתיבה, מה שמאפשר נתיבי קריאה מהירים במיוחד עבור סינון ורשימות. -
מצוינות ב-UX / UI: Tailwind CSS v4 + Vite מספקים ממשק משתמש רספונסיבי ומבוסס רכיבים. שיפורים הדרגתיים ונקודות קצה של JSON (למשל,
/api/tours-list) כלולים כדי לתמוך בחוויות צד-לקוח מהירות ווידג'טים של השלמה אוטומטית. -
אבטחה ואמינות: ברירות המחדל עוקבות אחר שיטות העבודה הטובות ביותר של Laravel—הגדרות קפדניות מבוססות סביבה, טפסים מוגנים מ-CSRF, אימות קפדני באמצעות Form Requests, וממשק ניהול (Filament) עבור CRUD מאובטח. הפרויקט כולל בדיקות Pest ועיצוב קוד באמצעות Pint לשמירה על היגיינת קוד.
ארכיטקטורה טכנית וטכנולוגיות
-
Backend / API
- תשתית: Laravel 12 (PHP ^8.2).
- תבנית: MVC + שכבת שירותים. שירותי מפתח כוללים
FilterService,PricingService, ו-CurrencyService(ראו app/Services). - ניהול: Filament v5 עבור ניהול תוכן וחוויית ניהול בטוחה.
- מסד נתונים: יחסי (מומלץ Postgres). הסכימה כוללת טבלאות
product_filtersדנורמליות להאצת שאילתות מורכבות.
-
Frontend
- כלים: Vite, Tailwind CSS v4.
- רכיבים: רכיבי Blade ניתנים לשימוש חוזר ונקודות קצה של JSON עבור ממשק משתמש אסינכרוני (חיפוש/השלמה אוטומטית).
- צד שלישי: Swiper עבור קרוסלות.
-
DevOps ותשתית
- סקריפטים למפתחים מקומיים מסופקים ב-composer.json (
setup,dev,test). - CI: הפרויקט משתמש ב-Pest לבדיקות וב-Pint לעיצוב; ניתן לשלב בצינורות CI לאכיפת בקרת איכות.
- מטמון: משתמש ב-Laravel Cache (מומלץ Redis) עבור רשימות מטבעות ומסננים מחושבים.
- קונטיינריזציה: עובד בתוך Docker באמצעות Laravel Sail או סביבת ה-PHP המועדפת עליך.
- סקריפטים למפתחים מקומיים מסופקים ב-composer.json (
תרשים ארכיטקטורה
graph LR
A[דפדפן משתמש] -->|HTTP/HTTPS| B[Laravel Frontend (Blade + Vite)]
B --> C[ניתובים/בקרים]
C --> D[שכבת שירות]
D -->|כתיבה| E[טבלת product_filters]
D -->|קריאה/כתיבה| F[מוצרים / תמחור / יציאות]
F --> G[Postgres]
D --> H[CurrencyService Cache (Redis)]
I[Filament Admin] --> F
תכונות מרכזיות וניתוחים טכניים עמוקים
- מסנני מוצרים (חיפוש מהיר ומורכב)
- תכונה: מסנני מוצרים מחושבים מראש המאוחסנים ב-
product_filtersכדי לאפשר סינון יעיל לפי מדינות, יעדים, טקסונומיות, טווחי מחירים ומשך זמן. - האתגר: הרצת Joins או אגרגציות כבדות על פני קטלוגים גדולים של מוצרים ותרגומים גורמת לזמני טעינה איטיים ושאילתות מורכבות.
- פתרון הנדסי:
FilterService::rebuildProductFilters()(ראו app/Services/FilterService.php) מרכיב שורות מנורמלות בעת שמירה/עדכון של מוצר ומכניס אותן ל-product_filters. נתיב הקריאה משתמש בלוגיקת חיתוך (getProductIdsByFilters) כדי לשלב קריטריוני סינון ביעילות—דבר זה הופך חיפושים של רבים-לרבים לשאילתות פשוטות עם אינדקסים ומפחית את העומס על בסיס הנתונים בזמן ריצה.
- תמחור והזמנות (טווח תאריכים, קבינות, מדיניות ילדים)
- תכונה: חישוב הצעת מחיר מדויק על פני וריאציות תמחור (לפי אדם, לפי קבינה), יציאות ועקיפות של טווחי תאריכים.
- האתגר: כללי התמחור משתנים לפי תאריך נסיעה, סוג קבינה או חדר ומדיניות הנחות לילדים, והמערכת חייבת להחזיר הצעות מחיר עקביות וניתנות לביקורת.
- פתרון הנדסי:
PricingService::calculateQuote()(ראו app/Services/PricingService.php) פותר את יחידת הבסיס הנכונה על ידי בדיקת מחירים ספציפיים ליציאה, מחירי קבינה, שורות תמחור מתוארכות, ולבסוף חלופות בטוחות. תמחור ילדים משתמש ב-childPolicyRulesכדי לחשב הנחות לפי גיל; המרת מטבע מואצלת ל-CurrencyServiceכמקור אמת יחיד. המימוש משתמש בסידור הגיוני (טווח->חלופה->נוצר_ב) כדי לבחור באופן דטרמיניסטי את שורת המחיר הנכונה.
- ניתוב רב-לשוני ו-SEO
- תכונה: נתיבים מקומיים עם Slugs מתורגמים, כתובות URL קנוניות ומסננים מודעי-שפה.
- האתגר: הגשת תוכן מקומי ידידותי ל-SEO תוך הימנעות מהתנגשויות ניתוב עם Slugs שמורים ושמירה על תאימות לאחור.
- פתרון הנדסי: נתיבים מקובצים ומוגנים עם Middleware מסוג
SetLocaleוקבוצות קידומות מקומיות ב-routes/web.php. נתיבי מוצרים מקוננים ומוכווני-מדינה משתמשים בהחרגות Regex כדי למנוע התנגשויות Slugs שמורים. תרגומים מאוחסנים בטבלאות תרגום לכל ישות, ושורות סינון מודעות-תרגום כוללותlanguage_idכך שמסנני ממשק המשתמש מציגים רק Slugs רלוונטיים עבור הלוקאל שנבחר.