Skip to content

Commit b273941

Browse files
[11.x] Add methods to the HTTP kernel to append middleware relative to other middleware (#52897)
* Add Kernel::addToMiddlewarePriority methods for relative positioning * Make Kernel::addToMiddlewarePriorityRelative() protected * Fix styling * Fix more code styling issues * formatting --------- Co-authored-by: Taylor Otwell <[email protected]>
1 parent b6a5179 commit b273941

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

src/Illuminate/Foundation/Http/Kernel.php

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -451,6 +451,69 @@ public function appendToMiddlewarePriority($middleware)
451451
return $this;
452452
}
453453

454+
/**
455+
* Add the given middleware to the middleware priority list before other middleware.
456+
*
457+
* @param array|string $before
458+
* @param string $middleware
459+
* @return $this
460+
*/
461+
public function addToMiddlewarePriorityBefore($before, $middleware)
462+
{
463+
return $this->addToMiddlewarePriorityRelative($before, $middleware, after: false);
464+
}
465+
466+
/**
467+
* Add the given middleware to the middleware priority list after other middleware.
468+
*
469+
* @param array|string $after
470+
* @param string $middleware
471+
* @return $this
472+
*/
473+
public function addToMiddlewarePriorityAfter($after, $middleware)
474+
{
475+
return $this->addToMiddlewarePriorityRelative($after, $middleware);
476+
}
477+
478+
/**
479+
* Add the given middleware to the middleware priority list relative to other middleware.
480+
*
481+
* @param string $middleware
482+
* @param string|array $existing
483+
* @param bool $after
484+
* @return $this
485+
*/
486+
protected function addToMiddlewarePriorityRelative($existing, $middleware, $after = true)
487+
{
488+
if (! in_array($middleware, $this->middlewarePriority)) {
489+
$index = $after ? 0 : count($this->middlewarePriority);
490+
491+
foreach ((array) $existing as $existingMiddleware) {
492+
if (in_array($existingMiddleware, $this->middlewarePriority)) {
493+
$middlewareIndex = array_search($existingMiddleware, $this->middlewarePriority);
494+
495+
if ($after && $middlewareIndex > $index) {
496+
$index = $middlewareIndex + 1;
497+
} elseif ($after === false && $middlewareIndex < $index) {
498+
$index = $middlewareIndex;
499+
}
500+
}
501+
}
502+
503+
if ($index === 0 && $after === false) {
504+
array_unshift($this->middlewarePriority, $middleware);
505+
} elseif (($after && $index === 0) || $index === count($this->middlewarePriority)) {
506+
$this->middlewarePriority[] = $middleware;
507+
} else {
508+
array_splice($this->middlewarePriority, $index, 0, $middleware);
509+
}
510+
}
511+
512+
$this->syncMiddlewareToRouter();
513+
514+
return $this;
515+
}
516+
454517
/**
455518
* Sync the current state of the middleware to the router.
456519
*

tests/Foundation/Http/KernelTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,62 @@ public function testGetMiddlewarePriority()
4646
], $kernel->getMiddlewarePriority());
4747
}
4848

49+
public function testAddToMiddlewarePriorityAfter()
50+
{
51+
$kernel = new Kernel($this->getApplication(), $this->getRouter());
52+
53+
$kernel->addToMiddlewarePriorityAfter(
54+
[
55+
\Illuminate\Cookie\Middleware\EncryptCookies::class,
56+
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
57+
],
58+
\Illuminate\Routing\Middleware\ValidateSignature::class,
59+
);
60+
61+
$this->assertEquals([
62+
\Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
63+
\Illuminate\Cookie\Middleware\EncryptCookies::class,
64+
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
65+
\Illuminate\Session\Middleware\StartSession::class,
66+
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
67+
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
68+
\Illuminate\Routing\Middleware\ValidateSignature::class,
69+
\Illuminate\Routing\Middleware\ThrottleRequests::class,
70+
\Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,
71+
\Illuminate\Contracts\Session\Middleware\AuthenticatesSessions::class,
72+
\Illuminate\Routing\Middleware\SubstituteBindings::class,
73+
\Illuminate\Auth\Middleware\Authorize::class,
74+
], $kernel->getMiddlewarePriority());
75+
}
76+
77+
public function testAddToMiddlewarePriorityBefore()
78+
{
79+
$kernel = new Kernel($this->getApplication(), $this->getRouter());
80+
81+
$kernel->addToMiddlewarePriorityBefore(
82+
[
83+
\Illuminate\Cookie\Middleware\EncryptCookies::class,
84+
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
85+
],
86+
\Illuminate\Routing\Middleware\ValidateSignature::class,
87+
);
88+
89+
$this->assertEquals([
90+
\Illuminate\Foundation\Http\Middleware\HandlePrecognitiveRequests::class,
91+
\Illuminate\Routing\Middleware\ValidateSignature::class,
92+
\Illuminate\Cookie\Middleware\EncryptCookies::class,
93+
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
94+
\Illuminate\Session\Middleware\StartSession::class,
95+
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
96+
\Illuminate\Contracts\Auth\Middleware\AuthenticatesRequests::class,
97+
\Illuminate\Routing\Middleware\ThrottleRequests::class,
98+
\Illuminate\Routing\Middleware\ThrottleRequestsWithRedis::class,
99+
\Illuminate\Contracts\Session\Middleware\AuthenticatesSessions::class,
100+
\Illuminate\Routing\Middleware\SubstituteBindings::class,
101+
\Illuminate\Auth\Middleware\Authorize::class,
102+
], $kernel->getMiddlewarePriority());
103+
}
104+
49105
public function testItTriggersTerminatingEvent()
50106
{
51107
$called = [];

0 commit comments

Comments
 (0)