Skip to content

Commit 631aab5

Browse files
author
Andrey Helldar
committed
Added check for possible duplication of middleware in groups
1 parent 6e45db6 commit 631aab5

File tree

3 files changed

+46
-3
lines changed

3 files changed

+46
-3
lines changed

src/ServiceProvider.php

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,43 @@
88

99
final class ServiceProvider extends BaseServiceProvider
1010
{
11+
protected $groups = ['web', 'api'];
12+
1113
public function boot(): void
1214
{
13-
$this->prepend('web', SetHeaderMiddleware::class);
14-
$this->prepend('api', SetHeaderMiddleware::class);
15+
foreach ($this->groups as $group) {
16+
$this->prepend($group, SetHeaderMiddleware::class);
17+
}
1518
}
1619

1720
protected function prepend(string $group, string $middleware): void
1821
{
19-
if ($this->hasGroup($group)) {
22+
if ($this->has($group, $middleware)) {
2023
$this->resolve()->prependMiddlewareToGroup($group, $middleware);
2124
}
2225
}
2326

27+
protected function has(string $group, string $middleware): bool
28+
{
29+
return $this->hasGroup($group) && $this->doesntMiddleware($group, $middleware);
30+
}
31+
2432
protected function hasGroup(string $group): bool
2533
{
2634
$groups = $this->getGroups();
2735

2836
return isset($groups[$group]);
2937
}
3038

39+
protected function doesntMiddleware(string $group, string $middleware): bool
40+
{
41+
$groups = $this->getGroups();
42+
43+
$group = $groups[$group];
44+
45+
return ! in_array($middleware, $group);
46+
}
47+
3148
protected function getGroups(): array
3249
{
3350
return $this->resolve()->getMiddlewareGroups();

tests/Middlewares/DuplicateTest.php

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?php
2+
3+
namespace Tests\Middlewares;
4+
5+
use Helldar\LaravelJsonResponse\Middlewares\SetHeaderMiddleware;
6+
use Tests\TestCase;
7+
8+
final class DuplicateTest extends TestCase
9+
{
10+
public function testCount()
11+
{
12+
foreach ($this->getMiddlewareGroups() as $group => $middlewares) {
13+
$count = count(array_filter($middlewares, static function ($middleware) {
14+
return $middleware === SetHeaderMiddleware::class;
15+
}));
16+
17+
$this->assertSame(1, $count, "The count of registered intermediaries is $count for $group, should be 1.");
18+
}
19+
}
20+
}

tests/TestCase.php

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace Tests;
44

55
use Helldar\LaravelJsonResponse\ServiceProvider;
6+
use Illuminate\Contracts\Http\Kernel;
67
use Orchestra\Testbench\TestCase as BaseTestCase;
78

89
abstract class TestCase extends BaseTestCase
@@ -27,4 +28,9 @@ protected function setRoutes($app): void
2728
return ['data' => 'Hello, JSON!'];
2829
})->middleware('api');
2930
}
31+
32+
protected function getMiddlewareGroups(): array
33+
{
34+
return $this->app->make(Kernel::class)->getMiddlewareGroups();
35+
}
3036
}

0 commit comments

Comments
 (0)