تخطَّ إلى المحتوى

المسارات في Laravel: Routes

الدرس 2 من 11 · Laravel

عندما يكتب الزائر عنواناً مثل /about أو /posts/5، كيف يعرف Laravel ماذا يعرض له؟ الإجابة: المسارات (Routes). المسار هو أول محطة يمر بها كل طلب في تطبيقك، ويحدد الكود الذي سيستقبله. في هذا الدرس ستتعلم كتابة المسارات بكل أشكالها الأساسية.

المسار قاعدة تقول: «إذا طلب الزائر هذا العنوان بـ هذه الطريقة، فنفّذ هذا الكود».

تخيّل موظف الاستقبال في مبنى كبير. تقول له: «أريد قسم الحسابات»، فيوجهك إلى الطابق الثالث. المسارات هي موظف الاستقبال في تطبيقك: تستقبل كل طلب وتوجهه إلى المكان الصحيح.

مسارات صفحات الموقع مكتوبة في الملف routes/web.php:

routes/web.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/hello', function () {
return 'مرحباً من Laravel!';
});
  • Route::get: المسار يستجيب لطلبات GET، أي فتح الصفحة في المتصفح.
  • '/hello': العنوان (URI) بعد اسم الموقع.
  • الدالة: الكود الذي يُنفَّذ، وما تُرجعه هو ما يراه الزائر.

افتح http://localhost:8000/hello وسترى:

الناتج
مرحباً من Laravel!

هذه الدالة بلا اسم تسمى Closure. وهي مناسبة للتجربة والصفحات البسيطة، لكن في التطبيقات الحقيقية ننقل الكود إلى Controllers كما سترى في الدرس القادم.

الدالة الاستخدام
Route::get عرض صفحة أو بيانات
Route::post استقبال بيانات نموذج لإنشاء شيء جديد
Route::put و Route::patch تعديل بيانات موجودة
Route::delete حذف بيانات

تذكّر من كورس PHP أن النماذج ترسل بـ GET أو POST. و Laravel يضيف طرقاً أخرى ليصبح لكل عملية طريقتها الواضحة.

المسار يمكن أن يُرجع نصاً، أو صفحة كاملة، أو حتى بيانات JSON:

Route::get('/api/course', function () {
return ['course' => 'Laravel', 'lessons' => 6];
});
الناتج
{"course":"Laravel","lessons":6}

عندما تُرجع مصفوفة، يحوّلها Laravel تلقائياً إلى JSON، وهي الصيغة التي تتبادل بها التطبيقات البيانات. وأكثر ما ستُرجعه في صفحات الموقع هو View كما ستتعلم في درس Blade:

Route::get('/welcome-page', function () {
return view('greeting');
});

كثيراً ما يحتوي الرابط على قيمة متغيرة: رقم مقال، أو اسم مستخدم. ضع اسم المعامل بين قوسين معقوفين، وسيصلك كمتغير في الدالة:

Route::get('/user/{name}', function (string $name) {
return "أهلاً يا $name";
});

زيارة /user/sara تعطي:

الناتج
أهلاً يا sara

أما زيارة /user بدون اسم، فتعطي خطأ 404 (الصفحة غير موجودة)، لأن المعامل إجباري.

معامل اختياري: أضف علامة ? بعد اسمه، وأعطه قيمة افتراضية:

Route::get('/greet/{name?}', function (?string $name = 'زائر') {
return "أهلاً يا $name";
});

الآن /greet تعطي «أهلاً يا زائر»، و /greet/omar تعطي «أهلاً يا omar».

تقييد المعامل: إذا كان المعامل يجب أن يكون رقماً فقط:

Route::get('/lessons/{id}', function (int $id) {
return "الدرس رقم $id";
})->whereNumber('id');

/lessons/5 تعطي «الدرس رقم 5»، أما /lessons/abc فتعطي 404 مباشرة، دون أن يصل الطلب لكودك.

يمكنك إعطاء المسار اسماً بالدالة name:

Route::get('/about-us', function () {
return 'صفحة من نحن';
})->name('about');

ثم تولّد رابطه في أي مكان بالدالة route:

Route::get('/link', function () {
return route('about');
});
الناتج
http://localhost:8000/about-us

لماذا هذا مفيد؟ لو قررت لاحقاً تغيير العنوان من /about-us إلى /who-we-are، تعدّل سطراً واحداً في المسار، وكل الروابط في موقعك تتغير تلقائياً لأنها تستخدم الاسم وليس العنوان. مثل أن تحفظ رقم صديقك في الهاتف باسمه: لو غيّر رقمه، تعدّل جهة الاتصال مرة واحدة فقط.

إذا نقلت صفحة لعنوان جديد، حوّل الزوار من العنوان القديم تلقائياً:

Route::redirect('/old-about', '/about-us');

مع كبر التطبيق ستكثر المسارات. هذا الأمر يعرضها كلها في جدول:

نافذة طرفيّة
php artisan route:list

وتستطيع تصفية النتيجة بـ --path، مثلاً php artisan route:list --path=posts يعرض المسارات التي تحتوي posts فقط، مع طريقة كل مسار واسمه والكود الذي ينفّذه.

أضف هذه المسارات إلى routes/web.php وجرّبها في المتصفح:

  1. /hello تُرجع رسالة ترحيب.
  2. /square/{number} تقبل أرقاماً فقط، وتُرجع «مربع 7 هو 49» مثلاً.
  3. /profile/{name?} باسم اختياري قيمته الافتراضية «ضيف».
  4. أعطِ المسار الأخير اسماً، ثم شغّل php artisan route:list وابحث عنه في الجدول.
  • 404 لمسار موجود: راجع العنوان حرفاً بحرف، وتأكد من طريقة الطلب: مسار Route::post لا يفتح بكتابة العنوان في المتصفح، لأن المتصفح يرسل GET.
  • نسيان return: إذا لم تُرجع الدالة شيئاً، تظهر صفحة بيضاء فارغة.
  • ترتيب المسارات: مسار عام مثل /posts/{id} المكتوب قبل /posts/create سيلتقط كلمة create على أنها id. اكتب المسارات الثابتة قبل التي فيها معاملات.

سؤال

ماذا يحدث عند زيارة /lessons/abc إذا كان المسار مقيداً بـ whereNumber('id')؟

سؤال

ما فائدة تسمية المسار بـ ->name('about')؟

  • المسار يربط عنواناً وطريقة طلب بكود ينفّذ، ومكانه routes/web.php.
  • Route::get للعرض و Route::post لاستقبال النماذج، والمصفوفة المُرجعة تتحول JSON.
  • المعاملات تُكتب {name}، والاختيارية {name?}، و whereNumber تقيّدها بالأرقام.
  • سمِّ المسارات بـ name() وولّد روابطها بـ route().
  • php artisan route:list تعرض كل مسارات تطبيقك.