واحدة من أهم التغييرات التي حصلت في Laravel 11 هي Routing Customization، بمعنى كيف يمكن لنا تعديل route كيفية إنشاء ملف route جديد وكيفية عمل versioning للـ api...
في Laravel 10 بداخل app/providers كان يوجد كلاس بإسم RouteServiceProvider.php لكن تم حذفه في Laravel 11، هذا الملف كان يمكن المبرمجين من التحكم بملف api وإنشاء prefix وإنشاء ملف route جديد.
للتحكم في 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 للتطبيق.
إنشاء ملف 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')); } )
كما تتيح لنا 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 نلاحظ أنه يعمل بشكل سليم.