الفرق بين المراجعتين لصفحة: «Laravel/routing»

من موسوعة حسوب
لا ملخص تعديل
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}'
 
(3 مراجعات متوسطة بواسطة مستخدمين اثنين آخرين غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE:التوجيه (Routing) في Laravel}}</noinclude>
<noinclude>{{DISPLAYTITLE:التوجيه (Routing) في Laravel}}</noinclude>
=== التوجيه الأساسي ===
== التوجيه الأساسي ==
تقبل أغلب مسارات Laravel الأساسيّة مُتغّيرين: رابط URI  و نطاق مغلق <code>Closure</code> مما يُوفّر طريقة بسيطة ومعبّرة جدّا لتعريف المسارات (routes):<syntaxhighlight lang="php">
تقبل أغلب مسارات [[Laravel]] الأساسيّة مُتغّيرين: رابط URI  و نطاق مغلق <code>Closure</code> مما يُوفّر طريقة بسيطة ومعبّرة جدّا لتعريف المسارات (routes):<syntaxhighlight lang="php">
Route::get('foo', function () {
Route::get('foo', function () {
     return 'Hello World';
     return 'Hello World';
سطر 7: سطر 7:
</syntaxhighlight>
</syntaxhighlight>


===== ملفات المسار الإفتراضيّة =====
=== ملفات المسار الإفتراضيّة ===
كل مسارات Laravel مُعرّفة في ملفات مساراتك الموجودة في المجلّد <code>routes</code>. يُحمّل إطار العمل كل هذه الملفّات تلقائيًا. يعرّف الملف <code>routes/web.php</code> كل المسارات المُخصّصة لواجهة الويب. مجموعة البرمجيّات الوسيطة <code>web</code> معيّنة على كل المسارات وتوفّر خاصيّات مثل حالة الجلسة (session state) والحماية CSRF. المسارات في <code>routes/api.php</code> بلا حالة (stateless) ومجموعة البرمجيّات الوسيطة <code>api</code> مُعيّنة عليهم.
كل مسارات [[Laravel]] مُعرّفة في ملفات مساراتك الموجودة في المجلّد <code>routes</code>. يُحمّل إطار العمل كل هذه الملفّات تلقائيًا. يعرّف الملف <code>routes/web.php</code> كل المسارات المُخصّصة لواجهة الويب. مجموعة [[Laravel/middleware|البرمجيّات الوسيطة]] <code>web</code> معيّنة على كل المسارات وتوفّر خاصيّات مثل حالة الجلسة (session state) و<nowiki/>[[Laravel/csrf|الحماية CSRF]]. المسارات في <code>routes/api.php</code> بلا حالة (stateless) ومجموعة [[Laravel/middleware|البرمجيّات الوسيطة]] <code>api</code> مُعيّنة عليهم.


ستبدأ في أغلب التطبيقات بتعريف المسارات في ملفك <code>routes/web.php</code>. يمكن الوصول للمسارات المُعرّفة في <code>routes/web.php</code> بإدخال رابط URL المسار المُعرّف في مُتصفّحك. على سبيل المثال، تستطيع الوصول للمسار التالي بالتنقّل إلى الرابط <code><nowiki>http://your-app.test/user</nowiki></code> على متصفّحك:<syntaxhighlight lang="php">
ستبدأ في أغلب التطبيقات بتعريف المسارات في ملفك <code>routes/web.php</code>. يمكن الوصول للمسارات المُعرّفة في <code>routes/web.php</code> بإدخال رابط URL المسار المُعرّف في مُتصفّحك. على سبيل المثال، تستطيع الوصول للمسار التالي بالتنقّل إلى الرابط <code><nowiki>http://your-app.test/user</nowiki></code> على متصفّحك:<syntaxhighlight lang="php">
سطر 15: سطر 15:
</syntaxhighlight>المسارات المُعرّفة في الملف <code>routes/api.php</code> متداخلة ضمن مجموعة المسارات عبر <code>RouteServiceProvider</code>. تضاف السابقة <code>/api</code> قبل URI تلقائيًّا داخل هذه المجموعة حتى لا تضطر لإضافتها يدويًّا لكل مسار في الملف. تستطيع تعديل السابقة وإعدادات مجموعة المسارات الأخرى بتعديل الصنف <code>RouteServiceProvider</code>.
</syntaxhighlight>المسارات المُعرّفة في الملف <code>routes/api.php</code> متداخلة ضمن مجموعة المسارات عبر <code>RouteServiceProvider</code>. تضاف السابقة <code>/api</code> قبل URI تلقائيًّا داخل هذه المجموعة حتى لا تضطر لإضافتها يدويًّا لكل مسار في الملف. تستطيع تعديل السابقة وإعدادات مجموعة المسارات الأخرى بتعديل الصنف <code>RouteServiceProvider</code>.


===== توابع جهاز التوجيه المُتوفّرة =====
=== توابع جهاز التوجيه المُتوفّرة ===
يسمح لك المُوجّه (router) بتسجيل مسارات تستجيب لأية طريقة HTTP:<syntaxhighlight lang="php">
يسمح لك المُوجّه (router) بتسجيل مسارات تستجيب لأية طريقة HTTP:<syntaxhighlight lang="php">
Route::get($uri, $callback);
Route::get($uri, $callback);
سطر 33: سطر 33:
</syntaxhighlight>
</syntaxhighlight>


===== الحماية CSRF =====
=== الحماية CSRF ===
يجب أن تحتوي كل استمارات HTML التي تشير لمسارات <code>POST</code>، أو <code>PUT</code>، أو <code>DELETE</code> المُعرّفة بملف المسارات <code>web</code> على حقل رمز CSRF. وإلا سيُرفض الطلب. يمكنك القراءة أكثر عن الحماية CSRF في توثيق CSRF:<syntaxhighlight lang="php">
يجب أن تحتوي كل استمارات HTML التي تشير لمسارات <code>POST</code>، أو <code>PUT</code>، أو <code>DELETE</code> المُعرّفة بملف المسارات <code>web</code> على حقل رمز CSRF. وإلا سيُرفض الطلب. يمكنك القراءة أكثر عن الحماية CSRF في [[Laravel/csrf|توثيق CSRF]]:<syntaxhighlight lang="php">
<form method="POST" action="/profile">
<form method="POST" action="/profile">
     @csrf
     @csrf
سطر 41: سطر 41:
</syntaxhighlight>
</syntaxhighlight>


===== إعادة توجيه المسارات =====
=== إعادة توجيه المسارات ===
إن كنت بصدد تعريف مسار يعيد التوجيه إلى رابط URI آخر، تستطيع استخدام التابع <code>Route::redirect</code>. يوفّر هذا التابع اختصارًا ملائمًا كي لا تضطر لتعريف مسار أو وحدة تحكّم (controller) كاملة. يقبل التابع واجهة view كأول متغيّر وسيط URI وإسم عرض (view name) كثاني متغيّر. علاوة على ذلك، تستطيع توفير مصفوفة بيانات لتمريرها للعرض (view) كمتغيّر وسيط ثالث اختياري:<syntaxhighlight lang="php">
إن كنت بصدد تعريف مسار يعيد التوجيه إلى رابط URI آخر، تستطيع استخدام التابع <code>Route::redirect</code>. يوفّر هذا التابع اختصارًا ملائمًا كي لا تضطر لتعريف مسار أو وحدة تحكّم (controller) كاملة. يقبل التابع واجهة view كأول متغيّر وسيط URI وإسم واجهة (view name) كثاني متغيّر. علاوة على ذلك، تستطيع توفير مصفوفة بيانات لتمريرها للواجهة (view) كمتغيّر وسيط ثالث اختياري:<syntaxhighlight lang="php">
Route::redirect('/here', '/there', 301);
Route::redirect('/here', '/there', 301);
</syntaxhighlight>
</syntaxhighlight>


===== مسارات العروض =====
=== مسارات الواجهات ===
تستطيع استخدام التابع <code>Route::view</code> إن احتجت فقط لرد عرض. يوفّر هذا التابع طريقاً مختصراً كي لا تضطر لتعريف مسار أو وحدة تحكّم كاملين  مثل التابع <code>redirect</code>. يقبل التابع <code>view</code> رابط URI كمُتغيّره الوسيط الأوّل واسم عرض كمتغيّره الثاني. إضافةً لذلك تستطيع توفير مصفوفة بيانات لتمريرها كمتغيّر ثالث إختياري:<syntaxhighlight lang="php">
تستطيع استخدام التابع <code>Route::view</code> إن احتجت فقط لرد واجهة. يوفّر هذا التابع طريقاً مختصراً كي لا تضطر لتعريف مسار أو وحدة تحكّم كاملين  مثل التابع <code>redirect</code>. يقبل التابع <code>view</code> رابط URI كمُتغيّره الوسيط الأوّل واسم واجهة كمتغيّره الثاني. إضافةً لذلك تستطيع توفير مصفوفة بيانات لتمريرها كمتغيّر ثالث إختياري:<syntaxhighlight lang="php">
Route::view('/welcome', 'welcome');
Route::view('/welcome', 'welcome');


سطر 66: سطر 66:
</syntaxhighlight>توضع معاملات المسار دائما بين {} معقّفين ويجب أن تتضمن محارف أبجديّة (alphabetic characters)، لا يجب أن تتضمّن الحرف - . استخدم الشرطة السفليّة (_) بدل استخدام الحرف -. تضاف معاملات المسار لردود نداء (callback) / وحدات تحكم المسار بناءًا على ترتيبهن - أسماء ردود النداء / متغيّرات وحدة التحكّم الوسيطة لا تهم.
</syntaxhighlight>توضع معاملات المسار دائما بين {} معقّفين ويجب أن تتضمن محارف أبجديّة (alphabetic characters)، لا يجب أن تتضمّن الحرف - . استخدم الشرطة السفليّة (_) بدل استخدام الحرف -. تضاف معاملات المسار لردود نداء (callback) / وحدات تحكم المسار بناءًا على ترتيبهن - أسماء ردود النداء / متغيّرات وحدة التحكّم الوسيطة لا تهم.


===== المعاملات الاختياريّة =====
=== المعاملات الاختياريّة ===
قد تحتاج أحيانًا لتحديد معامل (parameter) مسار لكن مع جعله اختياريًّا. تستطيع فعل هذا بوضع نقطة استفهام ? بعد اسم المعامل. لا تنس إعطاء متغيّر المسار قيمة افتراضيّة (default value):<syntaxhighlight lang="php">
قد تحتاج أحيانًا لتحديد معامل (parameter) مسار لكن مع جعله اختياريًّا. تستطيع فعل هذا بوضع نقطة استفهام <code>?</code> بعد اسم المعامل. لا تنس إعطاء متغيّر المسار قيمة افتراضيّة (default value):<syntaxhighlight lang="php">
Route::get('user/{name?}', function ($name = null) {
Route::get('user/{name?}', function ($name = null) {
     return $name;
     return $name;
سطر 94: سطر 94:
</syntaxhighlight>
</syntaxhighlight>


===== القيود العامّة =====
=== القيود العامّة ===
إن رغبت في تقييد معامل مسار ما بشكل دائم من طرف تعبير نمطي ما، تستطيع استخدام التابع <code>pattern</code>. يمكنك تعريف هذه الأنماط (patterns) في التابع <code>boot</code> من <code>RouteServiceProvider</code>:<syntaxhighlight lang="php">
إن رغبت في تقييد معامل مسار ما بشكل دائم من طرف تعبير نمطي ما، تستطيع استخدام التابع <code>pattern</code>. يمكنك تعريف هذه الأنماط (patterns) في التابع <code>boot</code> من <code>RouteServiceProvider</code>:<syntaxhighlight lang="php">
/**
/**
سطر 124: سطر 124:
</syntaxhighlight>
</syntaxhighlight>


==== توليد روابط URLs للمسارات المُسمّاة ====
=== توليد روابط URLs للمسارات المُسمّاة ===
بعد تعيينك اسمًا لمسار محدّد، تستطيع استخدام اسم المسار عند توليد روابط URLs أو إعادات توجيه عبر الدالّة العامّة <code>route</code>:<syntaxhighlight lang="php">
بعد تعيينك اسمًا لمسار محدّد، تستطيع استخدام اسم المسار عند توليد روابط URLs أو إعادات توجيه عبر الدالّة العامّة <code>route</code>:<syntaxhighlight lang="php">
// URLs توليد  
// URLs توليد  
سطر 139: سطر 139:
</syntaxhighlight>
</syntaxhighlight>


==== فحص المسار الحالي (Inspecting The Current Route) ====
=== فحص المسار الحالي (Inspecting The Current Route) ===
إذا رغبت في التأكّد إن وُجّه الطلب الحالي لمسار مُسمّى محدّد، يمكنك استخدام التابع named على نسخة المسار. قد مثلا تتحقّق من اسم المسار الحالي من برمجيّة مسار وسيطة:<syntaxhighlight lang="php">
إذا رغبت في التأكّد إن وُجّه الطلب الحالي لمسار مُسمّى محدّد، يمكنك استخدام التابع <code>named</code> على نسخة المسار. قد مثلا تتحقّق من اسم المسار الحالي من برمجيّة مسار وسيطة:<syntaxhighlight lang="php">
/**
/**
  * معالجة طلب وارد
  * معالجة طلب وارد
سطر 162: سطر 162:
تسمح لك مجموعات المسارات بمشاركة الخاصيات (attributes)، مثل البرمجيّات الوسيطة أو مجالات الأسماء (namespaces)، بين عدد كبير من المسارات دون الحاجة لتعريفها على حدة كل مرّة. تحدّد الخاصيات المشتركة في شكل مصفوفة كأول معاملة للتابع <code>Route::group</code>.
تسمح لك مجموعات المسارات بمشاركة الخاصيات (attributes)، مثل البرمجيّات الوسيطة أو مجالات الأسماء (namespaces)، بين عدد كبير من المسارات دون الحاجة لتعريفها على حدة كل مرّة. تحدّد الخاصيات المشتركة في شكل مصفوفة كأول معاملة للتابع <code>Route::group</code>.


=== البرمجيّات الوسيطة ===
=== [[Laravel/middleware|البرمجيّات الوسيطة]] ===
لتعيين البرمجيّات الوسيطة على كل المسارات في مجموعة، تستطيع استخدام التابع <code>middleware</code> قبل تعريف المجموعة. تُتفّذ البرمجيّات الوسيطة حسب ترتيب ورودها في المصفوفة:<syntaxhighlight lang="php">
لتعيين البرمجيّات الوسيطة على كل المسارات في مجموعة، تستطيع استخدام التابع <code>middleware</code> قبل تعريف المجموعة. تُتفّذ البرمجيّات الوسيطة حسب ترتيب ورودها في المصفوفة:<syntaxhighlight lang="php">
Route::middleware(['first', 'second'])->group(function () {
Route::middleware(['first', 'second'])->group(function () {
سطر 184: سطر 184:


=== توجيه النطاقات الفرعيّة (Sub-Domain Routing) ===
=== توجيه النطاقات الفرعيّة (Sub-Domain Routing) ===
يمكن استخدام مجموعات المسارات أيضًا لمعالجة توجيه النطاقات الفرعيّة (sub-domain). يمكن تعيين معاملات المسارات للنطاقات الفرعيّة مثل رابط URI المسارات تمامًا مما يسمح لك بالحصول على جزء من النطاق الفرعي لاستخدامه في مسارك أو في وحدة تحكّمك. يمكن تحديد النطاق الفرعي بمناداة التابع domain قبل تعريف المجموعة:<syntaxhighlight lang="php">
يمكن استخدام مجموعات المسارات أيضًا لمعالجة توجيه النطاقات الفرعيّة (sub-domain). يمكن تعيين معاملات المسارات للنطاقات الفرعيّة مثل رابط URI المسارات تمامًا مما يسمح لك بالحصول على جزء من النطاق الفرعي لاستخدامه في مسارك أو في وحدة تحكّمك. يمكن تحديد النطاق الفرعي بمناداة التابع <code>domain</code> قبل تعريف المجموعة:<syntaxhighlight lang="php">
Route::domain('{account}.myapp.com')->group(function () {
Route::domain('{account}.myapp.com')->group(function () {
     Route::get('user/{id}', function ($account, $id) {
     Route::get('user/{id}', function ($account, $id) {
سطر 216: سطر 216:


=== الارتباط الضمني ===
=== الارتباط الضمني ===
يستبين Laravel تلقائيًّا النماذج Eloquent المعرّفة في أفعال المسارات أو وحدات تحكّم التي تطابق متغيّراتها (variables) المُلمّحة على النوع (type-hinted) جزءًا من اسم مسار. على سبيل المثال:<syntaxhighlight lang="php">
يستبين [[Laravel]] تلقائيًّا النماذج Eloquent المعرّفة في أفعال المسارات أو وحدات تحكّم التي تطابق متغيّراتها (variables) المُلمّحة إلى النوع (type-hinted) جزءًا من اسم مسار. على سبيل المثال:<syntaxhighlight lang="php">
Route::get('api/users/{user}', function (App\User $user) {
Route::get('api/users/{user}', function (App\User $user) {
     return $user->email;
     return $user->email;
});
});
</syntaxhighlight>بما أن نوع المتغيّر user$ مُلمّح (type-hinted) على أنه النموذج Eloquent  الخاص ب App\User واسم المتغيّر يطابق جزء {user} من رابط URI، سيضيف Laravel نسخة النموذج صاحبة المعرّف ID المطابق للقيمة من رابط URI الطلب. سيولّد رد 404 HTTP تلقائيًّا إن لم توجد نسخة نموذج مطابقة.
</syntaxhighlight>بما أن نوع المتغيّر <code>user$</code> مُلمّح (type-hinted) على أنه النموذج [[Laravel/eloquent|Eloquent]]  الخاص ب <code>App\User</code> واسم المتغيّر يطابق جزء {user} من رابط URI، سيضيف [[Laravel]] نسخة النموذج صاحبة المعرّف ID المطابق للقيمة من رابط URI الطلب. سيولّد رد 404 HTTP تلقائيًّا إن لم توجد نسخة نموذج مطابقة.


==== تخصيص الاسم المفتاح (Customizing The Key Name) ====
==== تخصيص الاسم المفتاح (Customizing The Key Name) ====
إن أردت أن يستخدم ارتباط النموذج عمود قاعدة بيانات عدا المعرّف <code>id</code> عند استرداد صنف نموذج معيّن، تستطيع إعادة تعريف (override) التابع <code>getRouteKeyName</code>  في النموذج Eloquent:<syntaxhighlight lang="php">
إن أردت أن يستخدم ارتباط النموذج عمود قاعدة بيانات عدا المعرّف <code>id</code> عند استرداد صنف نموذج معيّن، تستطيع إعادة تعريف (override) التابع <code>getRouteKeyName</code>  في النموذج [[Laravel/eloquent|Eloquent]]:<syntaxhighlight lang="php">
/**
/**
  * تحصّل على مفتاح المسار للنموذج.
  * تحصّل على مفتاح المسار للنموذج.
سطر 271: سطر 271:
</syntaxhighlight>
</syntaxhighlight>


== حدّ المعدّل (Rate Limiting) ==
== حد المعدل (Rate Limiting) ==
يحتوي Laravel على برمجيّة وسيطة لحد معدّل الوصول للمسارات داخل تطبيقك. عيّن للبدء البرمجيّة الوسيطة <code>throttle</code> على مسار أو مجموعة مسارات. تقبل البرمجيّة الوسيطة <code>throttle</code> معاملتين تقرّران الحد الأقصى من الطلبات التي يمكن صنعها في عدد معيّن من الدقائق. فلنحدد مثلًا عدد المرات التي يقدر مستخدم مصادق عليه من الوصول فيها لمجموعة المسارات التالية 60 مرة في الدقيقة:<syntaxhighlight lang="php">
يحتوي [[Laravel]] على برمجيّة وسيطة لحد معدّل الوصول للمسارات داخل تطبيقك. عيّن للبدء البرمجيّة الوسيطة <code>throttle</code> على مسار أو مجموعة مسارات. تقبل البرمجيّة الوسيطة <code>throttle</code> معاملتين تقرّران الحد الأقصى من الطلبات التي يمكن صنعها في عدد معيّن من الدقائق. فلنحدد مثلًا عدد المرات التي يقدر مستخدم مصادق عليه من الوصول فيها لمجموعة المسارات التالية 60 مرة في الدقيقة:<syntaxhighlight lang="php">
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
Route::middleware('auth:api', 'throttle:60,1')->group(function () {
     Route::get('/user', function () {
     Route::get('/user', function () {
سطر 280: سطر 280:
</syntaxhighlight>
</syntaxhighlight>


==== حد المعدّل الديناميكي ====
=== حد المعدل الديناميكي ===
تستطيع تحديد حد طلبات أقصى ديناميكي على أساس خاصيّة (attribute) للنموذج <code>User</code> المصادق عليه. يمكنك مثلًا تمرير اسم الخاصية للبرمجيّة الوسيطة <code>throttle</code>  إن احتوى نموذجك <code>User</code> على الخاصيّة <code>rate_limit</code> كي يُستخدم لحساب حد الطلبات الأقصى:<syntaxhighlight lang="php">
تستطيع تحديد حد طلبات أقصى ديناميكي على أساس خاصيّة (attribute) للنموذج <code>User</code> المصادق عليه. يمكنك مثلًا تمرير اسم الخاصية للبرمجيّة الوسيطة <code>throttle</code>  إن احتوى نموذجك <code>User</code> على الخاصيّة <code>rate_limit</code> كي يُستخدم لحساب حد الطلبات الأقصى:<syntaxhighlight lang="php">
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
سطر 290: سطر 290:


== انتحال تابع الاستمارة (Form Method Spoofing) ==
== انتحال تابع الاستمارة (Form Method Spoofing) ==
لا تدعم استمارات HTML الطرق PUT، و PATCH، و DELETE. لذلك ستحتاج لإضافة حقل method_ خفيّ للاستمارة عند تعريف مسارات PUT، و PATCH، و DELETE التي تُنادى من استمارة HTML. ستُستَخدم القيمة المرسلة مع الحقل method_ كتابع الطلب HTTP:<syntaxhighlight lang="html">
لا تدعم استمارات HTML الطرق PUT، و PATCH، و DELETE. لذلك ستحتاج لإضافة حقل <code>method_</code> خفيّ للاستمارة عند تعريف مسارات PUT، و PATCH، و DELETE التي تُنادى من استمارة HTML. ستُستَخدم القيمة المرسلة مع الحقل <code>method_</code> كتابع الطلب HTTP:<syntaxhighlight lang="html">
<form action="/foo/bar" method="POST">
<form action="/foo/bar" method="POST">
     <input type="hidden" name="_method" value="PUT">
     <input type="hidden" name="_method" value="PUT">
     <input type="hidden" name="_token" value="{{ csrf_token() }}">
     <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>
</form>
</syntaxhighlight>تستطيع استخدام توجيه method Blade@ لتوليد حقل الإدخال method_:<syntaxhighlight lang="html">
</syntaxhighlight>تستطيع استخدام توجيه method Blade@ لتوليد حقل الإدخال <code>method_</code>:<syntaxhighlight lang="html">
<form action="/foo/bar" method="POST">
<form action="/foo/bar" method="POST">
     @method('PUT')
     @method('PUT')
سطر 311: سطر 311:
</syntaxhighlight>ارجع لتوثيق API لكل من الصنف الأساسي لواجهة المسار الساكنة ونسخة المسار لمراجعة كل الدوال الممكنة الوصول.
</syntaxhighlight>ارجع لتوثيق API لكل من الصنف الأساسي لواجهة المسار الساكنة ونسخة المسار لمراجعة كل الدوال الممكنة الوصول.


== المصادر ==
== مصادر ==
* صفحة Routing في توثيق الرّسمي.
* [https://laravel.com/docs/5.6/routing صفحة Routing في توثيق Laravel الرّسمي.]
[[تصنيف:Laravel]]
[[تصنيف:Laravel|{{SUBPAGENAME}}]]
[[تصنيف:Laravel Basics]]
[[تصنيف:Laravel Basics|{{SUBPAGENAME}}]]

المراجعة الحالية بتاريخ 13:28، 23 أكتوبر 2018

التوجيه الأساسي

تقبل أغلب مسارات Laravel الأساسيّة مُتغّيرين: رابط URI  و نطاق مغلق Closure مما يُوفّر طريقة بسيطة ومعبّرة جدّا لتعريف المسارات (routes):

Route::get('foo', function () {
    return 'Hello World';
});

ملفات المسار الإفتراضيّة

كل مسارات Laravel مُعرّفة في ملفات مساراتك الموجودة في المجلّد routes. يُحمّل إطار العمل كل هذه الملفّات تلقائيًا. يعرّف الملف routes/web.php كل المسارات المُخصّصة لواجهة الويب. مجموعة البرمجيّات الوسيطة web معيّنة على كل المسارات وتوفّر خاصيّات مثل حالة الجلسة (session state) والحماية CSRF. المسارات في routes/api.php بلا حالة (stateless) ومجموعة البرمجيّات الوسيطة api مُعيّنة عليهم.

ستبدأ في أغلب التطبيقات بتعريف المسارات في ملفك routes/web.php. يمكن الوصول للمسارات المُعرّفة في routes/web.php بإدخال رابط URL المسار المُعرّف في مُتصفّحك. على سبيل المثال، تستطيع الوصول للمسار التالي بالتنقّل إلى الرابط http://your-app.test/user على متصفّحك:

Route::get('/user', 'UserController@index');

المسارات المُعرّفة في الملف routes/api.php متداخلة ضمن مجموعة المسارات عبر RouteServiceProvider. تضاف السابقة /api قبل URI تلقائيًّا داخل هذه المجموعة حتى لا تضطر لإضافتها يدويًّا لكل مسار في الملف. تستطيع تعديل السابقة وإعدادات مجموعة المسارات الأخرى بتعديل الصنف RouteServiceProvider.

توابع جهاز التوجيه المُتوفّرة

يسمح لك المُوجّه (router) بتسجيل مسارات تستجيب لأية طريقة HTTP:

Route::get($uri, $callback);
Route::post($uri, $callback);
Route::put($uri, $callback);
Route::patch($uri, $callback);
Route::delete($uri, $callback);
Route::options($uri, $callback);

قد تحتاج أحيانًا لتسجيل مسار يستجيب لأكثر من طريقة HTTP. يمكنك فعل ذلك باستخدام التابع match أو يمكنك حتى تسجيل مسار يستجيب لكل طرق HTTP باسخدام التابع any:

Route::match(['get', 'post'], '/', function () {
   //
});

Route::any('foo', function () {
   //
});

الحماية CSRF

يجب أن تحتوي كل استمارات HTML التي تشير لمسارات POST، أو PUT، أو DELETE المُعرّفة بملف المسارات web على حقل رمز CSRF. وإلا سيُرفض الطلب. يمكنك القراءة أكثر عن الحماية CSRF في توثيق CSRF:

<form method="POST" action="/profile">
    @csrf
    ...
</form>

إعادة توجيه المسارات

إن كنت بصدد تعريف مسار يعيد التوجيه إلى رابط URI آخر، تستطيع استخدام التابع Route::redirect. يوفّر هذا التابع اختصارًا ملائمًا كي لا تضطر لتعريف مسار أو وحدة تحكّم (controller) كاملة. يقبل التابع واجهة view كأول متغيّر وسيط URI وإسم واجهة (view name) كثاني متغيّر. علاوة على ذلك، تستطيع توفير مصفوفة بيانات لتمريرها للواجهة (view) كمتغيّر وسيط ثالث اختياري:

Route::redirect('/here', '/there', 301);

مسارات الواجهات

تستطيع استخدام التابع Route::view إن احتجت فقط لرد واجهة. يوفّر هذا التابع طريقاً مختصراً كي لا تضطر لتعريف مسار أو وحدة تحكّم كاملين  مثل التابع redirect. يقبل التابع view رابط URI كمُتغيّره الوسيط الأوّل واسم واجهة كمتغيّره الثاني. إضافةً لذلك تستطيع توفير مصفوفة بيانات لتمريرها كمتغيّر ثالث إختياري:

Route::view('/welcome', 'welcome');

Route::view('/welcome', 'welcome', ['name' => 'Taylor']);

معاملات المسار (Route Parameters)

المعاملات المطلوبة (Required Parameters)

ستحتاج أحيانًا لالتقاط أجزاء من رابط URI ضمن مسارك. قد تحتاج مثلا لاقتطاع معرّف المستخدم. تستطيع فعل هذا بتعريف معاملات المسار:

Route::get('user/{id}', function ($id) {
    return 'User '.$id;
});

تستطيع تعريف أي عدد من المعاملات التي يتطلبها مسارك:

Route::get('posts/{post}/comments/{comment}', function ($postId, $commentId) {
   //
});

توضع معاملات المسار دائما بين {} معقّفين ويجب أن تتضمن محارف أبجديّة (alphabetic characters)، لا يجب أن تتضمّن الحرف - . استخدم الشرطة السفليّة (_) بدل استخدام الحرف -. تضاف معاملات المسار لردود نداء (callback) / وحدات تحكم المسار بناءًا على ترتيبهن - أسماء ردود النداء / متغيّرات وحدة التحكّم الوسيطة لا تهم.

المعاملات الاختياريّة

قد تحتاج أحيانًا لتحديد معامل (parameter) مسار لكن مع جعله اختياريًّا. تستطيع فعل هذا بوضع نقطة استفهام ? بعد اسم المعامل. لا تنس إعطاء متغيّر المسار قيمة افتراضيّة (default value):

Route::get('user/{name?}', function ($name = null) {
    return $name;
});

Route::get('user/{name?}', function ($name = 'John') {
    return $name;
});

قيود التعابير النمطيّة (Regular Expression Constraints)

تستطيع تقييد بنية معاملات مسارك باستخدام التابع where في نسخة مسار. يقبل التابع where  اسم المعامل وتعبيرًا نمطيًّا يُعرّف كيفيّة تقييد المعامل:

Route::get('user/{name}', function ($name) {
   //
})->where('name', '[A-Za-z]+');

Route::get('user/{id}', function ($id) {
   //
})->where('id', '[0-9]+');

Route::get('user/{id}/{name}', function ($id, $name) {
   //
})->where(['id' => '[0-9]+', 'name' => '[a-z]+']);

القيود العامّة

إن رغبت في تقييد معامل مسار ما بشكل دائم من طرف تعبير نمطي ما، تستطيع استخدام التابع pattern. يمكنك تعريف هذه الأنماط (patterns) في التابع boot من RouteServiceProvider:

/**
 *
 * عرّف قيود نموذج مسارك، ومرشّحات الأنماط، الخ
 * @return void
 */
public function boot()
{
    Route::pattern('id', '[0-9]+');

    parent::boot();
}

يطبّق النمط (pattern) فور تعريفه تلقائيًّا على كل المسارات التي تستخدم اسم المعامل ذاك:

Route::get('user/{id}', function ($id) {
   // عدداً {id} تنفّذ فقط إن كان 
});

المسارات المُسمّاة (Named Routes)

تسمح المسارات المُسمّاة بتوليد روابط  URLs أو إعادات توجيه لمسارات معيّنة. يمكنك تحديد اسم لمسار ما بربط التابع name بتعريف المسار:

Route::get('user/profile', function () {
    //
})->name('profile');

تستطيع أيضًا تحديد أسماء المسارات لأفعال وحدات التحكّم:

Route::get('user/profile', 'UserProfileController@show')->name('profile');

توليد روابط URLs للمسارات المُسمّاة

بعد تعيينك اسمًا لمسار محدّد، تستطيع استخدام اسم المسار عند توليد روابط URLs أو إعادات توجيه عبر الدالّة العامّة route:

// URLs توليد 
$url = route('profile');

// توليد إعادات توجيه
return redirect()->route('profile');

تستطيع تمرير المعاملات كالمتغيّر الوسيط الثّاني للدالّة route إن عرّف المسار المُسمّى المعاملات. ستضاف المعاملات المُعطاة تلقائيًّا داخل رابط URL في مكانهن الصّحيح:

Route::get('user/{id}/profile', function ($id) {
   //
})->name('profile');

$url = route('profile', ['id' => 1]);

فحص المسار الحالي (Inspecting The Current Route)

إذا رغبت في التأكّد إن وُجّه الطلب الحالي لمسار مُسمّى محدّد، يمكنك استخدام التابع named على نسخة المسار. قد مثلا تتحقّق من اسم المسار الحالي من برمجيّة مسار وسيطة:

/**
 * معالجة طلب وارد
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Closure  $next
 * @return mixed
 */
public function handle($request, Closure $next)
{
    if ($request->route()->named('profile')) {
       //
    }

    return $next($request);
}

مجموعات المسارات

تسمح لك مجموعات المسارات بمشاركة الخاصيات (attributes)، مثل البرمجيّات الوسيطة أو مجالات الأسماء (namespaces)، بين عدد كبير من المسارات دون الحاجة لتعريفها على حدة كل مرّة. تحدّد الخاصيات المشتركة في شكل مصفوفة كأول معاملة للتابع Route::group.

البرمجيّات الوسيطة

لتعيين البرمجيّات الوسيطة على كل المسارات في مجموعة، تستطيع استخدام التابع middleware قبل تعريف المجموعة. تُتفّذ البرمجيّات الوسيطة حسب ترتيب ورودها في المصفوفة:

Route::middleware(['first', 'second'])->group(function () {
    Route::get('/', function () {
       // يستخدم البرمجيّة الوسيطة الاولى والثانية  
    });

    Route::get('user/profile', function () {
       // يستخدم البرمجيّة الوسيطة الاولى والثانية 
    });
});

مجالات الأسماء

تعيين نفس مجال الأسماء PHP لمجموعة من وحدات التحكّم باستخدام التابع namespace هي حالة استخدام شائعة أخرى لمجموعات المسارات:

Route::namespace('Admin')->group(function () {
   //   "App\Http\Controllers\Admin" وحدات التحكم داخل جال الاسماء 
});

يتضمّن RouteServiceProvider افتراضيًّا ملفات مساراتك داخل مجموعة مجال أسماء، ممّا يسمح لك بتسجيل مسارات وحدة التجكّم دون الحاجة لتحديد سابقة مجال الأسماء App\Http\Controllers كاملة. تحتاج فقط لتحديد جزء مجال الأسماء الذي يأتي مع مجال الأسماء App\Http\Controllers الأساسي.

توجيه النطاقات الفرعيّة (Sub-Domain Routing)

يمكن استخدام مجموعات المسارات أيضًا لمعالجة توجيه النطاقات الفرعيّة (sub-domain). يمكن تعيين معاملات المسارات للنطاقات الفرعيّة مثل رابط URI المسارات تمامًا مما يسمح لك بالحصول على جزء من النطاق الفرعي لاستخدامه في مسارك أو في وحدة تحكّمك. يمكن تحديد النطاق الفرعي بمناداة التابع domain قبل تعريف المجموعة:

Route::domain('{account}.myapp.com')->group(function () {
    Route::get('user/{id}', function ($account, $id) {
       // "/admin/users" URL يماثل 
    });
});

سابقات المسار (Route Prefixes)

يمكن استخدام التابع prefix لسبق (prefix) كل مسار في المجموعة برابط URI معيّن. قد ترغب مثلًا في سبق كل روابط URIs المسارات داخل المجموعة admin:

Route::prefix('admin')->group(function () {
    Route::get('users', function () {
       // "/admin/users" URL يماثل 
    });
});

سابقات اسم المسار

يمكن استخدام التابع name لسبق كل اسم مسار في المجموعة بسلسلة نصيّة (string) معيّنة. قد ترغب مثلًا في سبق كل أسماء المسارات المجموعة ب admin. تسبق السلسلة النصيّة اسم المسار كما هي تمامًا لذا تأكّد من إضافة الحرف اللاحق . في السّابقة:

Route::name('admin.')->group(function () {
    Route::get('users', function () {
       // Route assigned name "admin.users"...
    })->name('users');
});

ارتباط نموذج المسار (Route Model Binding)

عند إضافة نموذج ID لمسار أو وحدة تحكّم، كثيرا ما ستستعلم (query) لاسترداد النموذج الذي يوافق ذاك ID. يوفّر ارتباط نموذج المسار طريقة ملائمة لإضافة نسخ نموذجك (model instances) مباشرة لمساراتك. يمكنك مثلًا إضافة نسخة النموذج User التي تطابق ID المحدد بدل إضافة ID المستخدم.

الارتباط الضمني

يستبين Laravel تلقائيًّا النماذج Eloquent المعرّفة في أفعال المسارات أو وحدات تحكّم التي تطابق متغيّراتها (variables) المُلمّحة إلى النوع (type-hinted) جزءًا من اسم مسار. على سبيل المثال:

Route::get('api/users/{user}', function (App\User $user) {
    return $user->email;
});

بما أن نوع المتغيّر user$ مُلمّح (type-hinted) على أنه النموذج Eloquent  الخاص ب App\User واسم المتغيّر يطابق جزء {user} من رابط URI، سيضيف Laravel نسخة النموذج صاحبة المعرّف ID المطابق للقيمة من رابط URI الطلب. سيولّد رد 404 HTTP تلقائيًّا إن لم توجد نسخة نموذج مطابقة.

تخصيص الاسم المفتاح (Customizing The Key Name)

إن أردت أن يستخدم ارتباط النموذج عمود قاعدة بيانات عدا المعرّف id عند استرداد صنف نموذج معيّن، تستطيع إعادة تعريف (override) التابع getRouteKeyName  في النموذج Eloquent:

/**
 * تحصّل على مفتاح المسار للنموذج.
 *
 * @return string
 */
public function getRouteKeyName()
{
    return 'slug';
}

الارتباط الصّريح

لتسجيل ارتباط صريح، استخدم التابع model للمُوجّه (router) لتحديد صنف معاملة معيّنة. يجب أن تعرّف ارتباطات نموذجك الصّريح في التابع boot من صنف RouteServiceProvider:

public function boot()
{
    parent::boot();

    Route::model('user', App\User::class);
}

في الخطوة التّالية عرّف مسارًا يحتوي معاملة {user}:

Route::get('profile/{user}', function (App\User $user) {
   //
});

ستضاف نسخة User للمسار بما أننا ربطنا كل معاملات {user} بالنموذج App\User. فمثلا الان سيضيف الطلب المُوجّه الى profile/1 نسخة User من قاعدة البيانات ذات ID يساوي 1.

إن لم توجد نسخة نموذج في قاعدة البيانات سيولّد رد 404 HTTP تلقائيٌّا.

تخصيص منطق التحليل (Customizing The Resolution Logic)

إن رغبت في استخدام منطق تحليل خاص بك، ما عليك إلا استخدام التابع Route::bind. سيتلقى النطاق المغلق Closure الذي تمرره للتابع bind  قيمة الجزء URI ويرد نسخة من الصّنف الذي يجب إضافته للمسار:

public function boot()
{
    parent::boot();

    Route::bind('user', function ($value) {
        return App\User::where('name', $value)->first() ?? abort(404);
    });
}

المسارات الاحتياطية (Fallback Routes)

تستطيع تعريف مسار إحتياطي يُنفَّذ عندما لا يطابق أي مسار اخر الطلب الوارد باستخدام التابع Route::fallback. تعرض الطلبات غير المُعالجة عموما صفحة "404" عبر معالج استثناءات تطبيقك. لكن ستُطبّق كل البرمجيّات الوسيطة في مجموعة البرمجيّات web الوسيطة على المسار fallback بما أنك تستطيع تعريفه داخل ملفك routes/web.php. أنت حر طبعًا في إضافة برمجيّات وسيطة لهذا المسار حسب الحاجة:

Route::fallback(function () {
   //
});

حد المعدل (Rate Limiting)

يحتوي Laravel على برمجيّة وسيطة لحد معدّل الوصول للمسارات داخل تطبيقك. عيّن للبدء البرمجيّة الوسيطة throttle على مسار أو مجموعة مسارات. تقبل البرمجيّة الوسيطة throttle معاملتين تقرّران الحد الأقصى من الطلبات التي يمكن صنعها في عدد معيّن من الدقائق. فلنحدد مثلًا عدد المرات التي يقدر مستخدم مصادق عليه من الوصول فيها لمجموعة المسارات التالية 60 مرة في الدقيقة:

Route::middleware('auth:api', 'throttle:60,1')->group(function () {
    Route::get('/user', function () {
       //
    });
});

حد المعدل الديناميكي

تستطيع تحديد حد طلبات أقصى ديناميكي على أساس خاصيّة (attribute) للنموذج User المصادق عليه. يمكنك مثلًا تمرير اسم الخاصية للبرمجيّة الوسيطة throttle  إن احتوى نموذجك User على الخاصيّة rate_limit كي يُستخدم لحساب حد الطلبات الأقصى:

Route::middleware('auth:api', 'throttle:rate_limit,1')->group(function () {
    Route::get('/user', function () {
        //
    });
});

انتحال تابع الاستمارة (Form Method Spoofing)

لا تدعم استمارات HTML الطرق PUT، و PATCH، و DELETE. لذلك ستحتاج لإضافة حقل method_ خفيّ للاستمارة عند تعريف مسارات PUT، و PATCH، و DELETE التي تُنادى من استمارة HTML. ستُستَخدم القيمة المرسلة مع الحقل method_ كتابع الطلب HTTP:

<form action="/foo/bar" method="POST">
    <input type="hidden" name="_method" value="PUT">
    <input type="hidden" name="_token" value="{{ csrf_token() }}">
</form>

تستطيع استخدام توجيه method Blade@ لتوليد حقل الإدخال method_:

<form action="/foo/bar" method="POST">
    @method('PUT')
    @csrf
</form>

الوصول للمسار الحالي

تستطيع استخدام التوابع current، و currentRouteName، و currentRouteAction على الواجهة الساكنة Route للوصول للمعلومة حول معالجة المسار للطلب القادم:

$route = Route::current();

$name = Route::currentRouteName();

$action = Route::currentRouteAction();

ارجع لتوثيق API لكل من الصنف الأساسي لواجهة المسار الساكنة ونسخة المسار لمراجعة كل الدوال الممكنة الوصول.

مصادر