Files
miniapi/vendor/topthink/think-dumper/src/Dumper.php
gaofeng 81ade70944 提交
2026-06-17 09:23:18 +08:00

104 lines
3.2 KiB
PHP

<?php
namespace think\dumper;
use Exception;
use Symfony\Component\VarDumper\Caster\ReflectionCaster;
use Symfony\Component\VarDumper\Cloner\VarCloner;
use Symfony\Component\VarDumper\Dumper\CliDumper;
use Symfony\Component\VarDumper\Dumper\ContextProvider\ContextProviderInterface;
use Symfony\Component\VarDumper\Dumper\ContextualizedDumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
use think\App;
use think\Env;
use think\Request;
class Dumper
{
public function __construct(protected App $app, protected Env $env)
{
}
public function dump($var, ?string $label = null)
{
$format = $this->app->runningInConsole() ? 'cli' : 'html';
$handler = $this->createHandler($format);
return $handler($var, $label);
}
private function createHandler($format)
{
$cloner = new VarCloner();
$cloner->addCasters(ReflectionCaster::UNSET_CLOSURE_FILE_INFO);
switch ($format) {
case 'html' :
$dumper = new HtmlDumper();
break;
case 'cli':
$dumper = new CliDumper();
break;
default:
throw new Exception('Invalid dump format.');
}
if ($this->env->has('DUMPER_TOKEN')) {
$dumper = new ServerDumper($dumper, $this->getDefaultContextProviders($format));
} else {
$dumper = new ContextualizedDumper($dumper, [new SourceContextProvider()]);
}
return function ($var, ?string $label = null) use ($cloner, $dumper) {
$var = $cloner->cloneVar($var);
if (null !== $label) {
$var = $var->withContext(['label' => $label]);
}
$dumper->dump($var);
};
}
private function getDefaultContextProviders($format): array
{
$contextProviders = [];
switch ($format) {
case 'html' :
$contextProviders['request'] = new class($this->app->request) implements ContextProviderInterface {
public function __construct(protected Request $request)
{
}
public function getContext(): ?array
{
$request = $this->request;
return [
'uri' => $request->url(),
'method' => $request->method(),
'identifier' => spl_object_hash($request),
];
}
};
break;
case 'cli':
$contextProviders['cli'] = new class implements ContextProviderInterface {
public function getContext(): ?array
{
return [
'command_line' => $commandLine = implode(' ', $_SERVER['argv'] ?? []),
'identifier' => hash('crc32b', $commandLine . $_SERVER['REQUEST_TIME_FLOAT']),
];
}
};
break;
}
$contextProviders['source'] = new SourceContextProvider();
return $contextProviders;
}
}