100 lines
3.3 KiB
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);
|
|
}
|
|
}
|
|
}
|