This package provides more flexible way to manage HTTP middleware priority in Laravel 11+ applications.
Please note that this package only compatible with fresh Laravel 11+ applications (or applications that have been upgraded to Laravel 11+ with new directory structure / application bootstrapping).
You can simply append/prepend your middleware to the priority list or do more complex things, such as:
- Add your middleware before or after specific middleware;
- Swap positions of two middleware;
- Remove middleware from the priority list.
This package provides default Laravel's priority list (latest update: Laravel 11.0.7; check DefaultMiddlewarePriority
class),
so you can use it as a base for your custom priority list.
You can install the package via composer:
composer require laniakea/middleware-priority
This package is intended to be used with Laravel's Application::configure()
builder (located in bootstrap/app.php
file).
<?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) {
// Manage priority list here.
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
Create new instance of Laniakea\MiddlewarePriority\MiddlewarePriorityManager
inside withMiddleware
callback
to start using middleware priority manager. Please note that the priority list will be empty by default
(unless you mutated it before creating manager instance).
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Laniakea\MiddlewarePriority\MiddlewarePriorityManager;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$manager = new MiddlewarePriorityManager($middleware);
// Manage priority list here.
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
If you want to use Laravel's default priority list, you can use static MiddlewarePriorityManager::withDefaults
method
to create manager instance with default priority list.
Second argument to the withDefaults()
method accepts user-defined list of default middleware priority (if it's null
or was not passed, default Laravel's priority list will be used).
<?php
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Laniakea\MiddlewarePriority\MiddlewarePriorityManager;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
$manager = MiddlewarePriorityManager::withDefaults($middleware); // create manager with default Laravel's priority list
// $manager = MiddlewarePriorityManager::withDefaults($middleware, ['App\\SomeMiddleware']); // create manager with custom priority list
// Manage priority list here.
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
Here and below it's assumed that manager created & used inside the
withMiddleware
callback.
Use append(string|array $middleware)
method to append middleware to the priority list.
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
use App\Http\Middleware\ThirdMiddleware;
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->append(FirstMiddleware::class);
// priority list: [..., FirstMiddleware::class]
$manager->append([SecondMiddleware::class, ThirdMiddleware::class]);
// priority list: [..., FirstMiddleware::class, SecondMiddleware::class, ThirdMiddleware::class]
Use prepend(string|array $middleware)
method to prepend middleware to the priority list.
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
use App\Http\Middleware\ThirdMiddleware;
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->prepend(FirstMiddleware::class);
// priority list: [FirstMiddleware::class, ...]
$manager->prepend([SecondMiddleware::class, ThirdMiddleware::class]);
// priority list: [SecondMiddleware::class, ThirdMiddleware::class, FirstMiddleware::class, ...]
Use before(string $middleware, string|array $newMiddleware)
method to add middleware before specific middleware.
<?php
use App\Http\Middleware\FirstMiddleware;
use Illuminate\Routing\Middleware\SubstituteBindings;
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->before(SubstituteBindings::class, FirstMiddleware::class);
// priority list: [..., FirstMiddleware::class, SubstituteBindings::class, ...]
Also you can use array of middleware as a second argument. In this case new middleware will be added according to the order in the array.
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
use Illuminate\Routing\Middleware\SubstituteBindings;
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->before(SubstituteBindings::class, [FirstMiddleware::class, SecondMiddleware::class]);
// priority list: [..., FirstMiddleware::class, SecondMiddleware::class, SubstituteBindings::class, ...]
Use after(string $middleware, string|array $newMiddleware)
method to add middleware after specific middleware.
<?php
use App\Http\Middleware\FirstMiddleware;
use Illuminate\Routing\Middleware\SubstituteBindings;
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->after(SubstituteBindings::class, FirstMiddleware::class);
// priority list: [..., SubstituteBindings::class, FirstMiddleware::class, ...]
Also you can use array of middleware as a second argument. In this case new middleware will be added according to the order in the array.
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
use Illuminate\Routing\Middleware\SubstituteBindings;
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->after(SubstituteBindings::class, [FirstMiddleware::class, SecondMiddleware::class]);
// priority list: [..., SubstituteBindings::class, FirstMiddleware::class, SecondMiddleware::class, ...]
Use swap(string $what, string $with)
method to swap positions of two middleware.
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
$manager = MiddlewarePriorityManager::withDefaults($middleware, [FirstMiddleware::class, SecondMiddleware::class]);
// priority list: [FirstMiddleware::class, SecondMiddleware::class]
$manager->swap(FirstMiddleware::class, SecondMiddleware::class);
// priority list: [SecondMiddleware::class, FirstMiddleware::class]
Use remove(string|array $what)
method to remove middleware from the priority list.
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
$manager = MiddlewarePriorityManager::withDefaults($middleware, [FirstMiddleware::class, SecondMiddleware::class]);
// priority list: [FirstMiddleware::class, SecondMiddleware::class]
$manager->remove(FirstMiddleware::class);
// priority list: [SecondMiddleware::class]
Also you can use array of middleware. All listed middleware will be removed from the priority list.
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
use App\Http\Middleware\ThirdMiddleware;
use Illuminate\Routing\Middleware\SubstituteBindings;
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->remove([SecondMiddleware::class, ThirdMiddleware::class]);
// priority list: [FirstMiddleware::class]
After removing middleware from the priority list, it's position will be determined by the order of registration in the group middleware. See example below.
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
use App\Http\Middleware\ThirdMiddleware;
use App\Http\Middleware\FourthMiddleware;
use App\Http\Middleware\FifthMiddleware;
$middleware->appendToGroup('web', [
FirstMiddleware::class,
SecondMiddleware::class,
ThirdMiddleware::class,
FourthMiddleware::class,
FifthMiddleware::class,
]);
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->prepend(FirstMiddleware::class);
// priority list: [FirstMiddleware::class, ...]
$manager->prepend(SecondMiddleware::class);
// priority list: [SecondMiddleware::class, FirstMiddleware::class, ...]
$manager->before(FirstMiddleware::class, FourthMiddleware::class);
// priority list: [SecondMiddleware::class, FourthMiddleware::class, FirstMiddleware::class, ...]
$manager->after(FourthMiddleware::class, ThirdMiddleware::class);
// priority list: [SecondMiddleware::class, FourthMiddleware::class, ThirdMiddleware::class, FirstMiddleware::class, ...]
$manager->remove(FourthMiddleware::class);
// priority list: [SecondMiddleware::class, ThirdMiddleware::class, FirstMiddleware::class, ...]
/*
* Middleware will be called in following order:
*
* 1. FourthMiddleware::class (was removed from the priority list);
* 2. FifthMiddleware::class (was not added to the priority list in first place);
* 3. SecondMiddleware::class (by priority list order);
* 4. ThirdMiddleware::class (by priority list order);
* 5. FirstMiddleware::class (by priority list order).
*/
If you need to retrieve current priority list, you can use getPriority()
method.
<?php
$manager = MiddlewarePriorityManager::withDefaults($middleware);
// Manage priority list here.
$currentPriority = $manager->getPriority();
<?php
use App\Http\Middleware\FirstMiddleware;
use App\Http\Middleware\SecondMiddleware;
use App\Http\Middleware\ThirdMiddleware;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Laniakea\MiddlewarePriority\MiddlewarePriorityManager;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware) {
// First you need to register middleware to some group.
$middleware->appendToGroup('web', [
FirstMiddleware::class,
SecondMiddleware::class,
ThirdMiddleware::class,
]);
// Now you can manage priority list.
$manager = MiddlewarePriorityManager::withDefaults($middleware);
$manager->prepend(FirstMiddleware::class);
$manager->before(\Illuminate\Routing\Middleware\SubstituteBindings::class, SecondMiddleware::class);
$manager->after(\Illuminate\Auth\Middleware\Authorize::class, ThirdMiddleware::class);
if (thirdMiddlewareNotRequired()) {
$manager->remove(ThirdMiddleware::class);
} elseif (thirdMiddlewareShouldBeFirst()) {
$manager->remove(ThirdMiddleware::class)
->prepend(ThirdMiddleware::class);
} elseif (thirdAndFirstMiddlewareShoudBeSwapped()) {
$manager->swap(FirstMiddleware::class, ThirdMiddleware::class);
}
\Log::debug('[app.php@withMiddleware] Priority list generated.', ['priority' => $manager->getPriority()]);
})
->withExceptions(function (Exceptions $exceptions) {
//
})->create();
composer test
Please see CHANGELOG for more information on what has changed recently.
The MIT License (MIT). Please see License File for more information.