واحدة من أهم التغييرات التي حصلت في Laravel 11 هي Routing Customization، بمعنى كيف يمكن لنا تعديل route كيفية إنشاء ملف route جديد وكيفية عمل versioning للـ api...
في Laravel 10 بداخل app/providers كان يوجد كلاس بإسم RouteServiceProvider.php لكن تم حذفه في Laravel 11، هذا الملف كان يمكن المبرمجين من التحكم بملف api وإنشاء prefix وإنشاء ملف route جديد.
تغييرات رئيسية في تسجيل route في Laravel 11:
- إزالة RouteServiceProvider: في Laravel 10، كان يُستخدم ملف RouteServiceProvider.php للتحكم في routes. تمّ حذف هذا الملف في Laravel 11، مما يمنح المطورين المزيد من التحكم في كيفية تسجيل routes.
- ملف app.php: أصبح ملف app.php هو المكان الرئيسي لتسجيل routes في Laravel 11. يتضمن هذا الملف وظيفة withRouting التي تُستخدم لتحديد مسارات routes المختلفة.
- وظيفة then: تُستخدم وظيفة then لتحديد routes مُخصصة. تسمح لك هذه الوظيفة بإنشاء مجموعات routes مُخصصة لكل ميزة من ميزات التطبيق.
- وظيفة using: تُستخدم وظيفة then لتحديد routes مُخصصة. تسمح لك هذه الوظيفة بإنشاء مجموعات routes مُخصصة لكل ميزة من ميزات التطبيق.
كيفية التحكم بالـ routes في Laravel 11.
للتحكم في routes في Laravel 11 وعمل register للـ application يجب الذهاب إلى الملف app.php الموجود داخل المجلد bootstrap.
لو ألقينا نظره على هذا الملف نجد أنه يحتوي على
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
//
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();نرى أن هذا الملف هو المسؤول عن route , exceptions, middleware حيث يتم عمل configuration ومن ثم عمل create للتطبيق.
تخصيص route في Laravel 11
إنشاء ملف admin.php للـ route الخاصه بالـ admin او أي ملف route أخر هنا نحتاج لإستخدام إو إضافة then
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
then: function () {
}
)فهي بمثالة routeServiceProvider في Laravel 10 حيث بداخلها يتم تعريف routes وكذلك versioning, prefix
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
then: function () {
Route::prefix('admin')
->name('admin.')
->group(base_path('routes/admin.php'));
}
)الأن يجب إنشاء الملف routes/admin.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return 'welcome to admin page';
});الأن عند زيارة الرابط ethar.test/admin وأي prefix = admin فإنه سيتم توجيهه مباشره للملف admin.php
مثال أخر
إنشاء ملف route خاص للـ prefix = webhooks
نذهب للملف bootstrap/app.php ونضيف route الخاص بـ webhooks بداخل then
then: function () {
Route::middleware('api')
->prefix('webhooks')
->name('webhooks.')
->group(base_path('routes/webhooks.php'));
Route::prefix('admin')
->middleware('web')
->name('admin.')
->group(base_path('routes/admin.php'));
}
)
ومن ثم نقوم بإنشاء routes/webhook.php
<?php
use Illuminate\Support\Facades\Route;
Route::get('/', function () {
return 'welcome webhook';
});سؤال : ماذا لو قمنا بتعطيل web: __DIR__.'/../routes/web.php',
->withRouting(
//web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
then: function () {
}
)الأن لو قمنا بفتح التطبيق ethar.test فإنه لن يعمل، وذلك لأننا قمنا بإزالة تسجيل route.
لكن يمكن لنا إعاده تسجيل route بداخل then
->withRouting(
//web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
then: function () {
Route::middleware('web')
->group(base_path('routes/web.php'));
}
)إستخدام using عوضا عن then
كما تتيح لنا Laravel 11 إستخدام then كذلك تتيح لنا إستخدام using وهي تأخذ كذلك callback function.
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
using: function () {
Route::middleware('web')
->prefix('webhooks')
->name('webhooks.')
->group(base_path('routes/webhooks.php'));
Route::prefix('admin')
->middleware('web')
->name('admin.')
->group(base_path('routes/admin.php'));
})
لكن الأن لو قمنا بزيارة التطبيق ethar.test فإنه لن يعمل ، بينما لو قمنا بزيارة ethar.test/admin او ethar.test/webhooks نلاحظ أنه يعمل بشكل سليم، وذلك لأن using تتجاهل
web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php',
hالموجودان بالأعلى، لكن تتعرف فقط على routes الموجوده بداخلها، فلو قمنا بإضافة web
->withRouting(
using: function () {
Route::middleware('web')
->group(base_path('routes/web.php'));
Route::middleware('web')
->prefix('webhooks')
->name('webhooks.')
->group(base_path('routes/webhooks.php'));
Route::prefix('admin')
->middleware('web')
->name('admin.')
->group(base_path('routes/admin.php'));
}االأن لو قمنا بزيارة ethar.test نلاحظ أنه يعمل بشكل سليم.