为什么Symfony';s@templating服务在dev和prod中提供不同的类?

为什么Symfony';s@templating服务在dev和prod中提供不同的类?,symfony,twig,Symfony,Twig,我有一个服务在dev中运行得很好。它看起来有点像这样: use Symfony\Bundle\TwigBundle\TwigEngine; public function __construct(TwigEngine $twig) { $this->twig = $twig; } // service methods here framework: templating: { engines: ['twig'] } 我在services.yml中通过传递@templ

我有一个服务在dev中运行得很好。它看起来有点像这样:

use Symfony\Bundle\TwigBundle\TwigEngine;

public function __construct(TwigEngine $twig)
{
    $this->twig = $twig;
}

// service methods here
framework:
    templating: { engines: ['twig'] }
我在
services.yml
中通过传递
@templating
来实例化它

在dev中,所有这些都工作得很好,但在我们的登台环境(使用Symfony的
prod
环境)中,我看到了一个500错误,该错误表示

must be an instance of Symfony\Bundle\TwigBundle\TwigEngine
但是相反

instance of Symfony\Bundle\FrameworkBundle\Templating\DelegatingEngine given.
我按照中的建议解决了这个问题,并改为在
Symfony\Bundle\FrameworkBundle\Templating\EngineInterface
上键入提示

但是,我想知道为什么会发生这种情况-为什么在
dev
(和
test
)中传递了
TwigEngine
实例,而在
prod
中传递了
delegatingine

my
config.yml
中的相关行如下所示:

use Symfony\Bundle\TwigBundle\TwigEngine;

public function __construct(TwigEngine $twig)
{
    $this->twig = $twig;
}

// service methods here
framework:
    templating: { engines: ['twig'] }
(我尝试将其更改为
引擎:“twig”
——即使用字符串而不是数组——但这并没有影响任何事情。)


有人知道为什么不同环境的行为不同吗?

Symfony允许通过
@Template(engine='foo')
()为每个控制器操作提供不同的引擎

旧答案:

对于开发环境,您不希望有一些额外的信息 关于模板渲染过程(计时、内存消耗、数量) 渲染的块数等)。此信息可通过探查器或 默认配置中的dev工具栏

然而,这对于您所在的生产环境通常是浪费的 想要性能

因此,为了满足不同的需求,框架具有不同的配置 对于prod/dev环境


这可以在没有DelegatingEngine的情况下很好地实现。请参阅。

您将在此处找到提示:Hi@COil。不幸的是,我实际上并没有使用多个引擎(这是
DelegatingEngine
所帮助的,也是您链接到的那篇文章所讨论的)。请参阅我在原始帖子中关于
config.yml
的注释。不过,感谢您的回复!细枝模板缓存在生产环境中,而它们总是在开发环境中重新呈现。我想这与此有关-使用了不同的类。感谢您的评论,但是您确定
DelegatingEngine
提供的是这些额外信息吗?该引擎更多地是用于管理而不是提供调试信息。我希望您提到的那种调试信息能够被正常的模板引擎有条件地公开。我检查了代码-调试信息与DelegatingEngine无关。更新的答案。我不知道这可以使用控制器注释指定,谢谢提示!不幸的是,这并不能解释dev/prod之间的差异。当您需要在现有类中添加功能时,您可以使用继承或组合。即,将
TwigEngine
PhpEngine
传递到
ProfilingEngine
。通过这种方式,您可以灵活地按价格包装任何发动机,
instanceof TwigEngine
检查失败。要处理此检查,请使用
EngineInterface
。只需在setter中添加断点,然后查看在每个环境中通过的引擎类型。