dump/src/DumpMiddleware.php

100 lines
3.3 KiB
PHP

<?php declare(strict_types=1);
namespace Dump {
use Psr\Http\Server\MiddlewareInterface,
Psr\Http\Message\ServerRequestInterface,
Psr\Http\Server\RequestHandlerInterface,
Psr\Http\Message\ResponseInterface;
use Laminas\Diactoros\{ Response, Stream, Response\JsonResponse, Response\HtmlResponse, Response\TextResponse };
use function stream_copy_to_stream;
class DumpMiddleware implements MiddlewareInterface
{
/**
* @var [class]
*/
protected static $dump_stack = [];
/**
* Processing the dump stack accumulated in the request
* @param ServerRequestInterface $request
* @param RequestHandlerInterface $handler
* @return ResponseInterface
*/
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface
{
$response = $handler->handle($request);
$stream = new class("php://memory", "rw") extends Stream {
public function append_resource($resource) {
stream_copy_to_stream($resource, $this->resource);
}
};
$body = $response->getBody();
$body->rewind();
switch (true) {
case $response instanceof TextResponse:
foreach(static::$dump_stack as $item) {
$stream->write($item->renderText());
}
$stream->append_resource($body->detach());
break;
case $response instanceof JsonResponse:
foreach(static::$dump_stack as $item) {
$dump[] = $item->renderArray();
}
if (! empty($dump)) {
$stream->write(json_encode(array_merge([ "_dump" => $dump ?? [] ], (array) json_decode($body->getContents() ?? "{}", true)), JsonResponse::DEFAULT_JSON_FLAGS));
}
else {
$stream = $body;
}
break;
case $response instanceof HtmlResponse:
#$stream->write(<<<HTML
# <span style="position:fixed;right:0;bottom:0;color:#4b4b4b;padding:2px 6px;z-index:99999999999;pointer-events:none;opacity:0.6;font-size:0.8em">env: DEV</span>
#HTML);
# no break;
default:
case $response instanceof Response:
foreach(static::$dump_stack as $item) {
$stream->write($item->renderHtml());
}
$stream->append_resource($body->detach());
break;
}
$stream->rewind();
return $response->withBody($stream);
}
public static function dump(...$what)
{
static::$dump_stack[] = $dump = new Dump(...$what);
return $dump;
}
}
}
namespace {
if (! function_exists('dump') ) {
function dump(...$what) {
return \Dump\DumpMiddleware::dump(...$what);
}
}
}