إتقان طرق Laravel
نشرت: 2022-12-12عندما يتعلق الأمر بالواجهة الخلفية ، يواجه المطورون في النهاية طرقًا. يمكن اعتبار المسارات العمود الفقري للواجهة الخلفية حيث يتم إعادة توجيه كل طلب يتلقاها الخادم إلى وحدة تحكم من خلال قائمة التوجيه التي تعين الطلبات إلى وحدات التحكم أو الإجراءات.
يخفي Laravel العديد من تفاصيل التنفيذ بالنسبة لنا ويأتي مع الكثير من السكر النحوي لمساعدة المطورين الجدد وذوي الخبرة على تطوير تطبيقات الويب الخاصة بهم.
دعنا نلقي نظرة فاحصة على كيفية إدارة المسارات في Laravel.
توجيه الواجهة الخلفية والبرمجة عبر المواقع في Laravel
على الخادم ، توجد طرق عامة وخاصة. يمكن أن تكون الطرق العامة مدعاة للقلق بسبب إمكانية البرمجة النصية عبر المواقع (XSS) ، وهو نوع من هجوم الحقن الذي يمكن أن يجعلك أنت ومستخدميك عرضة للجهات الضارة.
تكمن المشكلة في أنه يمكن إعادة توجيه المستخدم من مسار لا يتطلب رمزًا مميزًا للجلسة إلى آخر لا يتطلب ذلك - وسيظل بإمكانه الوصول بدون الرمز المميز.
إن أبسط طريقة لحل هذه المشكلة هي فرض رأس HTTP جديد ، مع إضافة "مُحيل" إلى المسار للتخفيف من هذا السيناريو:
'main' => [ 'path' => '/main', 'referrer' => 'required,refresh-empty', 'target' => Controller\DashboardController::class . '::mainAction' ]
توجيه Laravel الأساسي
في Laravel ، تسمح المسارات للمستخدمين بتوجيه الطلب المناسب إلى وحدة التحكم المطلوبة. يقبل مسار Laravel الأساسي معرف أصل موحد (مسار مسارك) وإغلاق يمكن أن يكون وظيفة أو فئة.
في Laravel ، يتم إنشاء المسارات داخل ملفات web.php و api.php . يأتي Laravel مع مسارين افتراضيًا: أحدهما لـ WEB والآخر لواجهة برمجة التطبيقات.
هذه المسارات موجودة في المسارات / المجلد ، لكن يتم تحميلها في Providers / RouteServiceProvider.php .
بدلاً من القيام بذلك ، يمكننا تحميل المسارات مباشرة داخل RouteServiceProvider.php ، وتخطي المسارات / المجلد تمامًا.
عمليات إعادة التوجيه
عندما نحدد مسارًا ، سنرغب عادةً في إعادة توجيه المستخدم الذي يصل إليه ، وتختلف أسباب ذلك كثيرًا. قد يكون ذلك بسبب أنه مسار مهمل وقمنا بتغيير الواجهة الخلفية أو الخادم ، أو ربما لأننا نريد تثبيت المصادقة الثنائية (2FA) ، وما إلى ذلك.
لدى Laravel طريقة سهلة للقيام بذلك. بفضل بساطة إطار العمل ، يمكننا استخدام طريقة إعادة التوجيه على واجهة المسار ، والتي تقبل مسار الإدخال والمسار المراد إعادة التوجيه إليه.
اختياريًا ، يمكننا إعطاء رمز الحالة لإعادة التوجيه كمعامل ثالث. سيفعل التابع permanentRedirect
نفس طريقة redirect
، باستثناء أنه سيعيد دائمًا رمز الحالة 301:
// Simple redirect Route::redirect("/class", "/myClass"); // Redirect with custom status Route::redirect("/home", "/office", 305); // Route redirect with 301 status code Route::permanentRedirect("/home", "office");
داخل مسارات إعادة التوجيه ، يُحظر علينا استخدام الكلمات المفتاحية "الوجهة" و "الحالة" كمعلمات كما هي محفوظة بواسطة Laravel.
// Illegal to use Route::redirect("/home", "/office/{status}");
الآراء
الآراء هي. blade.php التي نستخدمها لتقديم الواجهة الأمامية لتطبيق Laravel الخاص بنا. يستخدم محرك قوالب النصل ، وهي الطريقة الافتراضية لبناء تطبيق مكدس كامل باستخدام Laravel فقط.
إذا أردنا أن يعيد طريقنا عرضًا ، يمكننا ببساطة استخدام طريقة العرض على واجهة المسار. يقبل معلمة مسار ، واسم مشاهدة ، ومجموعة اختيارية من القيم ليتم تمريرها إلى المشاهدة.
// When the user accesses my-domain.com/homepage // the homepage.blade.php file will be rendered Route::view("/homepage", "homepage");
لنفترض أن وجهة نظرنا تريد أن تقول "مرحبًا ، {name}
" بتمرير مصفوفة اختيارية بهذه المعلمة. يمكننا فعل ذلك بالشفرة التالية (إذا كانت المعلمة المفقودة مطلوبة في العرض ، فسيفشل الطلب ويحدث خطأ):
Route::view('/homepage', 'homepage', ['name' => "Kinsta"]);
قائمة الطريق
كلما زاد حجم تطبيقك ، زاد عدد الطلبات التي يجب توجيهها. ومع الكم الهائل من المعلومات يمكن أن يحدث ارتباك كبير.
هذا هو المكان الذي يمكن أن يساعدنا فيه artisan route:list command
. يوفر نظرة عامة على جميع المسارات المحددة في التطبيق ، والأدوات الوسيطة ، ووحدات التحكم الخاصة بهم.
php artisan route:list
سيعرض قائمة بجميع المسارات بدون الأدوات الوسيطة. لهذا ، علينا استخدام العلم -v
:
php artisan route:list -v
في المواقف التي قد تستخدم فيها تصميمًا يحركه المجال حيث يكون لطرقك أسماء محددة في مساراتها ، يمكنك الاستفادة من إمكانيات التصفية لهذا الأمر كما يلي:
php artisan route:list –path=api/account
سيعرض هذا فقط المسارات التي تبدأ بـ api / account .
من ناحية أخرى ، يمكننا توجيه تعليمات إلى Laravel لاستبعاد أو تضمين المسارات المعرفة من قبل طرف ثالث باستخدام خياري –except-vendor
أو –only-vendor
.
معلمات الطريق
قد تحتاج أحيانًا إلى التقاط أجزاء من URI مع المسار ، مثل معرف المستخدم أو الرمز المميز. يمكننا القيام بذلك عن طريق تحديد معلمة المسار ، والتي تكون دائمًا مغطاة بأقواس معقوفة ( {}
) ويجب أن تتكون فقط من أحرف أبجدية.
إذا كانت مساراتنا تحتوي على تبعيات داخل عمليات الاسترجاعات الخاصة بها ، فستقوم حاوية خدمة Laravel بحقنها تلقائيًا:
use Illuminate\Http\Request; use Controllers/DashboardController; Route::post('/dashboard/{id}, function (Request $request, string $id) { return 'User:' . $id; } Route::get('/dashboard/{id}, DashboardController.php);
المعلمات المطلوبة
معلمات Laravel المطلوبة هي معلمات في المسارات التي لا يُسمح لنا بتخطيها عند إجراء مكالمة. خلاف ذلك ، سيتم إلقاء خطأ:
Route::post("/gdpr/{userId}", GetGdprDataController.php");
الآن داخل GetGdprDataController.php سيكون لدينا وصول مباشر إلى المعلمة $ userId .
public function __invoke(int $userId) { // Use the userId that we received… }
يمكن أن يأخذ المسار أي عدد من المعلمات. يتم حقنها في عمليات الاسترجاعات / وحدات التحكم الخاصة بالمسار بناءً على الترتيب الذي تم سردها به:
// api.php Route::post('/gdpr/{userId}/{userName}/{userAge}', GetGdprDataController.php); // GetGdprDataController.php public function __invoke(int $userId, string $userName, int $userAge) { // Use the parameters… }
معلمات اختيارية
في الحالة التي نريد فيها القيام بشيء ما على المسار عندما يكون هناك معلمة فقط ولا شيء آخر ، كل ذلك دون التأثير على التطبيق بأكمله ، يمكننا إضافة معامل اختياري. يتم الإشارة إلى هذه المعلمات الاختيارية بواسطة ?
ملحقة بهم:
Route::get('/user/{age?}', function (int $age = null) { if (!$age) Log::info("User doesn't have age set"); else Log::info("User's age is " . $age); } Route::get('/user/{name?}', function (int $name = "John Doe") { Log::info("User's name is " . $name); }
طريق Wildcard
يوفر لنا Laravel طريقة لتصفية الشكل الذي يجب أن تبدو عليه معاملاتنا الاختيارية أو المطلوبة.
لنفترض أننا نريد سلسلة من معرف المستخدم. يمكننا التحقق من صحتها على هذا النحو على مستوى المسار باستخدام طريقة where
.
يقبل التابع where
اسم المعلمة وقاعدة regex التي سيتم تطبيقها على التحقق من الصحة. بشكل افتراضي ، يأخذ المعلمة الأولى ، ولكن إذا كان لدينا الكثير ، يمكننا تمرير مصفوفة باسم المعلمة كمفتاح والقاعدة كقيمة ، وسيقوم Laravel بتحليلها جميعًا لنا:
Route::get('/user/{age}', function (int $age) { // }->where('age', '[0-9]+'); Route::get('/user/{age}', function (int $age) { // }->where('[0-9]+'); Route::get('/user/{age}/{name}', function (int $age, string $name) { // }->where(['age' => '[0-9]+', 'name' => '[az][Az]+');
يمكننا اتخاذ هذه الخطوة إلى الأمام وتطبيق التحقق من الصحة على جميع المسارات في تطبيقنا باستخدام طريقة pattern
على واجهة Route
:
Route::pattern('id', '[0-9]+');
سيؤدي هذا إلى تقييم كل معلمة id
باستخدام تعبير regex هذا. وبمجرد تحديده ، سيتم تطبيقه تلقائيًا على جميع المسارات باستخدام اسم المعلمة هذا.
كما نرى ، يستخدم Laravel الحرف /
كفاصل في المسار. إذا أردنا استخدامه في المسار ، فعلينا أن نسمح له صراحة بأن يكون جزءًا من العنصر النائب الخاص بنا باستخدام regex where
.
Route::get('/find/{query}', function ($query) { // })->where('query', , '.*');
الجانب السلبي الوحيد هو أنه سيتم دعمه فقط في جزء المسار الأخير.
المسارات المسماة
كما يوحي الاسم ، يمكننا تسمية المسارات ، مما يجعل إنشاء عناوين URL أو إعادة التوجيه لمسارات معينة أمرًا ملائمًا.
كيفية إنشاء مسارات محددة
يتم توفير طريقة بسيطة لإنشاء مسار محدد بواسطة طريقة name
المقيدة في واجهة Route
. يجب أن يكون اسم كل مسار فريدًا:
Route::get('/', function () { })->name("homepage");
مجموعات الطريق
تسمح لك مجموعات المسارات بمشاركة سمات المسار مثل البرامج الوسيطة عبر عدد كبير من المسارات دون الحاجة إلى إعادة تعريفها في كل مسار.
الوسيطة
يتيح لنا تعيين برمجية وسيطة لجميع المسارات التي لدينا دمجها في مجموعة ، أولاً باستخدام طريقة group
. شيء واحد يجب مراعاته هو أن البرامج الوسيطة يتم تنفيذها بالترتيب الذي يتم تطبيقه به على المجموعة:
Route:middleware(['AuthMiddleware', 'SessionMiddleware'])->group(function () { Route::get('/', function() {} ); Route::post('/upload-picture', function () {} ); });
تحكم
عندما تستخدم المجموعة نفس وحدة التحكم ، يمكننا استخدام طريقة controller
لتحديد وحدة التحكم المشتركة لجميع المسارات داخل تلك المجموعة. الآن علينا تحديد الطريقة التي سيستدعيها المسار.
Route::controller(UserController::class)->group(function () { Route::get('/orders/{userId}', 'getOrders'); Route::post('/order/{id}', 'postOrder'); });
توجيه المجال الفرعي
اسم المجال الفرعي هو جزء من المعلومات الإضافية المضافة إلى بداية اسم مجال موقع الويب. يسمح هذا لمواقع الويب بفصل وتنظيم المحتوى الخاص بها لوظائف محددة ، مثل المتاجر عبر الإنترنت والمدونات والعروض التقديمية وما إلى ذلك من باقي مواقع الويب.
يمكن استخدام مساراتنا للتعامل مع توجيه النطاق الفرعي. يمكننا التقاط المجال وجزء من المجال الفرعي للاستخدام في وحدة التحكم والمسار الخاصة بنا. بمساعدة التابع domain
على واجهة Route
، يمكننا تجميع مساراتنا تحت مجال واحد:
Route::domain('{store}.enterprise.com')->group(function() { Route::get('order/{id}', function (Account $account, string $id) { // Your Code } });
البادئات وبادئات الاسم
عندما يكون لدينا مجموعة من المسارات ، بدلاً من تعديلها واحدة تلو الأخرى ، يمكننا الاستفادة من الأدوات الإضافية التي يوفرها Laravel ، مثل prefix
name
على واجهة Route
.
يمكن استخدام طريقة prefix
لبادئة كل مسار في المجموعة بمعرف URI محدد ، ويمكن استخدام طريقة name
لبادئة كل اسم مسار بسلسلة معينة.
يتيح لنا ذلك إنشاء أشياء جديدة مثل مسارات المسؤول دون الحاجة إلى تعديل كل اسم أو بادئة لتحديدها:
Route::name('admin.")->group(function() { Route::prefix("admin")->group(function() { Route::get('/get')->name('get'); Route::put('/put')->name(put'); Route::post('/post')->name('post'); }); });
الآن ستكون URIs لهذه المسارات هي admin/get
، admin/put
، admin/post
، والأسماء admin.get
و admin.put
و admin.post
.
الطريق التخزين المؤقت
عند نشر التطبيق على خوادم الإنتاج ، سيستفيد مطور Laravel الجيد من ذاكرة التخزين المؤقت لمسار Laravel.
ما هو الطريق التخزين المؤقت؟
يقلل التخزين المؤقت للمسار مقدار الوقت الذي يستغرقه تسجيل جميع مسارات التطبيق.
تشغيل php artisan route:cache
نسخة من Illuminate/Routing/RouteCollection
مؤقتًا ، وبعد تشفيرها ، تتم كتابة الإخراج المتسلسل على bootstrap/cache.routes.php
.
الآن أي طلب آخر سيتم تحميل ملف ذاكرة التخزين المؤقت هذا إذا كان موجودًا. لذلك ، لم يعد تطبيقنا مضطرًا إلى تحليل الإدخالات وتحويلها من ملف المسار إلى كائنات Illuminate/Routing/Route
في Illuminate/Routing/RouteCollection
.
لماذا من المهم استخدام مسار التخزين المؤقت
من خلال عدم استخدام ميزة التخزين المؤقت للمسار التي يوفرها Laravel ، يخاطر تطبيقك بالعمل بشكل أبطأ مما يمكن أن يكون ، مما قد يؤدي بدوره إلى تقليل المبيعات والاحتفاظ بالمستخدمين والثقة في علامتك التجارية.
اعتمادًا على حجم مشروعك وعدد المسارات الموجودة ، يمكن أن يؤدي تشغيل أمر بسيط للتخزين المؤقت للمسار إلى تسريع تطبيقك في أي مكان من 130٪ إلى 500٪ - وهو مكسب هائل بدون جهد تقريبًا.
ملخص
التوجيه هو العمود الفقري لتطوير الخلفية. يتفوق إطار عمل Laravel في ذلك من خلال توفير طريقة مطولة لتعريف وإدارة المسارات.
يمكن بالفعل أن يكون التطوير متاحًا للجميع ويساعد في تسريع التطبيق فقط بحكم أنه يتم بناؤه في Laravel.
ما الحيل والنصائح الأخرى التي واجهتها بخصوص مسارات Laravel؟ دعنا نعلم فى قسم التعليقات!