PHP项目Symfony var-dumper与样式

wen PHP项目 2

本文目录导读:

PHP项目Symfony var-dumper与样式

  1. 基础安装与使用
  2. 样式定制
  3. 高级样式配置
  4. 样式控制的最佳实践
  5. 性能优化建议

在Symfony项目中,var-dumper 是一个非常强大的调试工具,它提供了比 var_dump()print_r() 更清晰、更交互式的变量输出方式,下面详细讲解它的使用和样式定制。

基础安装与使用

安装

composer require symfony/var-dumper --dev

基本使用

use Symfony\Component\VarDumper\VarDumper;
// 简单使用
dump($variable);
// 带标签
dump($variable, '我的调试信息');
// 一次性dump多个
dump($var1, $var2, $var3);
// dd() - dump并终止执行
dd($variable);

样式定制

全局配置

config/packages/dev/var_dumper.yaml 中配置:

# config/packages/dev/var_dumper.yaml
when@dev:
    var_dumper:
        config:
            # 自定义样式
            theme: 'light'  # 可选: light, dark, auto
            # 最大深度
            max_depth: 5
            # 字符串最大长度
            max_string_length: 100
            # 显示的文件路径
            display_file: false

样式主题

VarDumper 提供了5种内置主题:

use Symfony\Component\VarDumper\Dumper\HtmlDumper;
// 设置主题
$dumper = new HtmlDumper();
$dumper->setTheme('light');    // 浅色
$dumper->setTheme('dark');     // 深色
$dumper->setTheme('default');  // 默认
$dumper->setTheme('custom');   // 自定义

自定义CSS样式

// 在控制器或服务中
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
use Symfony\Component\VarDumper\Cloner\VarCloner;
class DebugService
{
    public function customDump($data)
    {
        $cloner = new VarCloner();
        $dumper = new HtmlDumper();
        // 自定义CSS
        $dumper->setDisplayOptions([
            'maxDepth' => 3,
            'maxStringLength' => 50,
            'fileLinkFormat' => null,
        ]);
        // 自定义样式
        $dumper->setStyles([
            'default' => 'background-color:#2d2d2d; color:#f8f8f2;',
            'num' => 'font-weight:bold; color:#ae81ff;',
            'const' => 'font-weight:bold; color:#66d9ef;',
            'str' => 'font-style:italic; color:#e6db74;',
            'note' => 'color:#f92672;',
            'ref' => 'color:#a6e22e;',
            'public' => 'color:#a6e22e;',
            'protected' => 'color:#fd971f;',
            'private' => 'color:#f92672;',
            'meta' => 'color:#75715e;',
            'key' => 'color:#66d9ef;',
            'index' => 'color:#f92672;',
        ]);
        $output = fopen('php://memory', 'r+b');
        $dumper->dump($cloner->cloneVar($data), $output);
        return stream_get_contents($output, -1, 0);
    }
}

高级样式配置

创建自定义Dumper类

// src/Dumper/CustomHtmlDumper.php
namespace App\Dumper;
use Symfony\Component\VarDumper\Dumper\HtmlDumper;
class CustomHtmlDumper extends HtmlDumper
{
    public function __construct($output = null, $charset = null, $flags = 0)
    {
        parent::__construct($output, $charset, $flags);
        // 自定义样式映射
        $this->setStyles([
            'default' => '
                background-color: #1e1e1e;
                color: #d4d4d4;
                font-family: "Fira Code", "Consolas", monospace;
                font-size: 14px;
                line-height: 1.5;
                padding: 10px;
                border-radius: 4px;
            ',
            'num' => 'color: #b5cea8;',
            'const' => 'color: #569cd6;',
            'str' => 'color: #ce9178;',
            'note' => 'color: #dcdcaa; font-style: italic;',
            'ref' => 'color: #c586c0;',
            'public' => 'color: #4ec9b0;',
            'protected' => 'color: #c586c0;',
            'private' => 'color: #d16969;',
            'meta' => 'color: #608b4e; font-size: 12px;',
            'key' => 'color: #9cdcfe;',
            'index' => 'color: #f0f0f0;',
            'ellipsis' => 'color: #ffcc00; cursor: pointer;',
        ]);
    }
}

在Twig模板中使用

{# templates/debug.html.twig #}
{% set customDumper = create_var_dumper() %}
{% do customDumper.setTheme('dark') %}
<div class="debug-section">
    <h3>变量调试</h3>
    {{ dump(variable, 'debug-container')|raw }}
</div>
{% if app.environment == 'dev' %}
    <style>
        .sf-dump {
            background-color: #1a1a2e !important;
            border: 1px solid #16213e !important;
        }
        .sf-dump .sf-dump-str {
            color: #e94560 !important;
        }
        .sf-dump .sf-dump-key {
            color: #0f3460 !important;
        }
    </style>
{% endif %}

样式控制的最佳实践

环境区分

# config/packages/var_dumper.yaml
when@dev:
    var_dumper:
        config:
            theme: 'light'
when@test:
    var_dumper:
        config:
            theme: 'dark'
when@prod:
    var_dumper:
        config:
            enabled: false  # 生产环境禁用

条件样式加载

// 在基控制器中
abstract class BaseController extends AbstractController
{
    protected function initializeDebugDumper(): void
    {
        if ($this->getParameter('kernel.environment') === 'dev') {
            $dumper = new HtmlDumper();
            // 根据用户偏好加载样式
            if ($this->getUser()?->getPreference('debug_theme') === 'dark') {
                $dumper->setTheme('dark');
            }
            VarDumper::setHandler(function ($var) use ($dumper) {
                $dumper->dump((new VarCloner())->cloneVar($var));
            });
        }
    }
}

自定义样式文件

创建独立的CSS文件:

/* assets/styles/debug.custom.css */
.sf-dump {
    background-color: #2c3e50 !important;
    color: #ecf0f1 !important;
    font-family: 'JetBrains Mono', monospace !important;
}
.sf-dump .sf-dump-num {
    color: #e67e22 !important;
    font-weight: bold;
}
.sf-dump .sf-dump-str {
    color: #2ecc71 !important;
    font-style: italic;
}
.sf-dump .sf-dump-const {
    color: #3498db !important;
}
.sf-dump .sf-dump-public {
    color: #1abc9c;
}
.sf-dump .sf-dump-protected {
    color: #9b59b6;
}
.sf-dump .sf-dump-private {
    color: #e74c3c;
}

在模板中引用:

{% if app.environment == 'dev' %}
    <link rel="stylesheet" href="{{ asset('styles/debug.custom.css') }}">
{% endif %}

性能优化建议

  1. 仅在开发环境启用
  2. 对大型对象设置深度限制
  3. 使用 dump() 而非 var_dump()
  4. 避免在循环中使用 dump()
  5. 使用 VarCloner 设置克隆选项
use Symfony\Component\VarDumper\Cloner\VarCloner;
$cloner = new VarCloner();
$cloner->setMaxItems(25);           // 最大显示项目数
$cloner->setMaxString(100);         // 最大字符串长度
$cloner->setCasterMaxDepth(3);      // 最大深度

通过合理配置和使用这些样式功能,你可以在Symfony项目中获得既美观又实用的调试输出体验。

抱歉,评论功能暂时关闭!