Skip to content

Commit

Permalink
feat: Support des groupes de middlewares
Browse files Browse the repository at this point in the history
Ce commit refactorise la classe MiddlewareQueue pour introduire le support des groupes de middlewares.
Auparavant, il n'y avait pas de mécanisme pour définir des groupes de middlewares, ce qui rendait difficile l'organisation et la gestion de l'ordre d'exécution. l'ordre d'exécution.
Avec ce changement, vous pouvez maintenant définir des groupes de middlewares et spécifier l'ordre dans lequel ils seront exécutés.

Les changements sont les suivants :
- Ajout d'une nouvelle propriété `$groups` dans la classe MiddlewareQueue pour stocker les groupes de middlewares.
- Ajout d'une nouvelle méthode `groups(array $groups)` dans la classe MiddlewareQueueue pour définir les groupes de middlewares.
- Modification de la méthode `register()` dans la classe MiddlewareQueueue pour remplir la propriété `$groups` avec les groupes de middlewares fournis.
- Ajout d'une nouvelle méthode `resolveGroups()` dans la classe MiddlewareQueueue
pour résoudre les groupes de middlewares et les insérer dans la file d'attente d'exécution.
  • Loading branch information
dimtrovich committed Jan 12, 2024
1 parent 109acec commit 7d6b928
Show file tree
Hide file tree
Showing 3 changed files with 88 additions and 3 deletions.
37 changes: 37 additions & 0 deletions spec/system/framework/Http/MiddlewareRunner.spec.php
Expand Up @@ -67,4 +67,41 @@

expect($log)->toBe(['one', 'two', 'three']);
});

it("Groupe de middlewares", function () {
$log = [];
$one = function ($request, $handler) use (&$log) {
$log[] = 'one';

return $handler->handle($request);
};
$two = function ($request, $handler) use (&$log) {
$log[] = 'two';

return $handler->handle($request);
};
$three = function ($request, $handler) use (&$log) {
$log[] = 'three';

return $handler->handle($request);
};
$four = function ($request, $handler) use (&$log) {
$log[] = 'four';

return $handler->handle($request);
};

$groups = [
'web' => [$two, $three],
'api' => [$four],
];

$this->queue->groups($groups)->add('web')->add($one)->add(['api']);

$runner = new MiddlewareRunner();
$result = $runner->run($this->queue, $this->request);
expect($result)->toBeAnInstanceOf(Response::class);

expect($log)->toBe(['two', 'three', 'one', 'four']);
});
});
53 changes: 50 additions & 3 deletions src/Http/MiddlewareQueue.php
Expand Up @@ -41,6 +41,13 @@ class MiddlewareQueue implements Countable, SeekableIterator
*/
protected array $aliases = [];

/**
* Groupes de middlewares
*
* @var array<string, array>
*/
protected array $groups = [];

/**
* Constructor
*
Expand Down Expand Up @@ -73,6 +80,18 @@ public function aliases(array $aliases): static
return $this;
}

/**
* Ajoute des groupes de middlewares
*
* @param array<string, array> $groups
*/
public function groups(array $groups): static
{
$this->groups = array_merge($this->groups, $groups);

return $this;
}

/**
* Ajoute un middleware a la chaine d'execution
*/
Expand Down Expand Up @@ -295,12 +314,14 @@ public function valid(): bool
public function register(array $config)
{
$config += [
'aliases' => [],
'globals' => [],
'build' => static fn () => null,
'aliases' => [],
'globals' => [],
'groups' => [],
'build' => static fn () => null,
];

$this->aliases($config['aliases']);
$this->groups($config['groups']);

foreach ($config['globals'] as $middleware) {
$this->add($middleware);
Expand All @@ -314,6 +335,32 @@ public function register(array $config)
}
}

/**
* Resout les groups pour definir les middlewares
*
* @internal
*/
public function resolveGroups()
{
foreach ($this->queue as $queue) {
if (is_string($queue) && !empty($this->groups[$queue])) {
if (! is_array($this->groups[$queue])) {
continue;
}

$i = array_search($queue, $this->queue);
$j = 0;

unset($this->queue[$i]);

foreach ($this->groups[$queue] as $middleware) {
$this->insertAt(($i + $j), $middleware);
$j++;
}
}
}
}

/**
* {@internal}
*/
Expand Down
1 change: 1 addition & 0 deletions src/Http/MiddlewareRunner.php
Expand Up @@ -38,6 +38,7 @@ public function run(MiddlewareQueue $queue, ServerRequestInterface $request, ?Re
$this->queue = $queue;
$this->fallback = $fallback;
$this->queue->rewind();
$this->queue->resolveGroups();

return $this->handle($request);
}
Expand Down

0 comments on commit 7d6b928

Please sign in to comment.