D7net
Home
Console
Upload
information
Create File
Create Folder
About
Tools
:
/
usr
/
local
/
psa
/
admin
/
plib
/
modules
/
grafana
/
vendor
/
laminas
/
laminas-stratigility
/
src
/
Filename :
Next.php
back
Copy
<?php declare (strict_types=1); namespace PleskGrafana\Laminas\Stratigility; use PleskGrafana\Laminas\Stratigility\Exception\MiddlewarePipeNextHandlerAlreadyCalledException; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; use SplQueue; /** * Iterate a queue of middlewares and execute them. */ final class Next implements RequestHandlerInterface { private RequestHandlerInterface $fallbackHandler; /** @var SplQueue<MiddlewareInterface> */ private ?SplQueue $queue; /** * Clones the queue provided to allow re-use. * * @param SplQueue<MiddlewareInterface> $queue * @param RequestHandlerInterface $fallbackHandler Fallback handler to * invoke when the queue is exhausted. */ public function __construct(SplQueue $queue, RequestHandlerInterface $fallbackHandler) { $this->queue = clone $queue; $this->fallbackHandler = $fallbackHandler; } public function handle(ServerRequestInterface $request) : ResponseInterface { if ($this->queue === null) { throw MiddlewarePipeNextHandlerAlreadyCalledException::create(); } if ($this->queue->isEmpty()) { $this->queue = null; return $this->fallbackHandler->handle($request); } $middleware = $this->queue->dequeue(); $next = clone $this; // deep clone is not used intentionally $this->queue = null; // mark queue as processed at this nesting level return $middleware->process($request, $next); } }