如何在将在生产环境中呈现的模板中使用"dump()"树枝函数?

  • 本文关键字:dump 函数 生产环境 symfony twig
  • 更新时间 :
  • 英文 :


我想在我们的测试环境中实现一个调试输出,我想在其中输出应用程序发送的服务请求。

我想使用symfony/树枝dump()函数,因为这里输出是非常格式化为所有类型的变量,也提供了打开和关闭的选项结构。

伪代码应该是这样的

{% if debugEnabled %}
{{dump (debugInfos)}}
{% endif %}

不幸的是,"dump"是Symfony DebugBundle的一部分,这为理由不加载Prod环境,应该保持这种方式:

SymfonyBundleDebugBundleDebugBundle::class => ['dev' => true, 'test' => true],

在Symfony文档中说:

按照设计,dump()函数只在开发和测试中可用环境,以避免在生产中泄露敏感信息。在事实上,尝试在prod环境中使用dump()函数将会导致PHP错误

我根本不想在生产环境中使用dump(),而只想在本地输出我们的服务请求。

然而,我不能实现像上面这样的代码,因为在生产中总是发生错误(未定义的函数dump()),当然,因为dump()根本没有加载。

您可以创建自己的函数来测试扩展是否已加载。正如您在源代码中看到的那样,twig_var_dump函数是注册的,因此您可以测试该函数是否存在,以确定是否加载了调试扩展。

应该可以将自己的函数注册为dump,只要您的扩展在调试扩展

之后加载
namespace AppTwig;
use TwigExtensionAbstractExtension;
use TwigTwigFunction;
use TwigEnvironment;
class AppExtension extends AbstractExtension
{
public function getFunctions()
{
return [
new TwigFunction('dump', [$this, 'dump'] , ['needs_context' => true, 'needs_environment' => true, ]),
];
}
public function dump(Environment $env, $context, ...$vars)
{
if (!function_exists('twig_var_dump')) return;
return twig_var_dump($env, $context, ...$vars);
}
}

旁注:没有测试过,但应该可以工作

创建只在生产环境中加载的扩展。

在src目录下创建一个文件夹(例如Twig)。如果使用默认值

,则将该文件夹排除在自动生成之外。
App:
resource: '../src/'
exclude:
- '../src/DependencyInjection/'
- '../src/Entity/'
- '../src/Kernel.php'
- '../src/Tests/'
- '../src/Twig/' # This is the directory excluded from autowiring

然后创建一个config/services_prod.yaml文件,内容如下:

services:
AppTwigFakeDebugExtension: # replace with your class name
tags:
- twig.extension # not needed if you use autoconfiguration

然后用以下内容创建一个类:

<?php
namespace AppTwig;
use TwigExtensionAbstractExtension;
use TwigTwigFunction;
final class FakeDebugExtension extends AbstractExtension
{
public function getFunctions(): array
{
return [
new TwigFunction('dump', [$this, 'fakeDump']),
];
}
public function fakeDump(...$arguments): void
{
}
}