Symfony的@templating服务为什么在开发环境和生产环境中提供不同的类?

4

我有一个在开发环境中运行良好的服务,它看起来有点像这样:

use Symfony\Bundle\TwigBundle\TwigEngine;

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

// service methods here

我在services.yml中通过传递@templating来实例化它。

在开发环境中,一切都运行良好,但在我们的暂存环境(使用Symfony的prod环境),我看到一个500错误,其中提到了参数。

must be an instance of Symfony\Bundle\TwigBundle\TwigEngine

但实际上...
instance of Symfony\Bundle\FrameworkBundle\Templating\DelegatingEngine given.

我通过遵循这个相关的bug报告中的建议,对Symfony\Bundle\FrameworkBundle\Templating\EngineInterface进行了类型提示来解决此问题。
然而,我想知道为什么会出现这种情况——为什么在dev(和test)中传递TwigEngine实例,但在prod中传递DelegatingEngine
我的config.yml中相关的行如下:
framework:
    templating: { engines: ['twig'] }

我曾试过将其更改为 engines: 'twig' - 即使用字符串而不是数组 - 但这没有影响任何内容。有人知道为什么在不同的环境中行为不同吗?

您可以在这里找到提示:http://symfony.com/doc/current/components/templating/introduction.html#using-multiple-engines - COil
嗨@COil。不幸的是,我实际上并没有使用多个引擎(这正是“DelegatingEngine”有所帮助以及您链接到的文章所讨论的内容)。请参阅我在原帖中关于“config.yml”的注释。但还是谢谢你的回复! - Sam
Twig模板在生产环境中被缓存,而在开发环境中总是重新渲染。我猜这与使用不同的类有关。 - Marcel Burkhard
1个回答

0

Symfony允许通过@Template(engine='foo')doc)在每个控制器操作中使用不同的引擎。

旧答案:

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

但是,在生产环境中,这通常是浪费的,因为您需要性能

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

这可以很好地实现而不需要DelegatingEngine。请参见TimedPhpEngine


谢谢您的评论,但您确定DelegatingEngine提供了这些额外信息吗?该引擎更多地涉及管理多个可能的模板引擎,而不是提供调试信息。我期望您提到的调试信息只是由普通的模板引擎有条件地公开。 - Sam
我检查了代码 - 调试信息与DelegatingEngine无关。已更新答案。 - Im0rtality
我不知道这可以使用控制器注释来指定,谢谢你的提示!不幸的是,这并不能解释开发/生产差异。 - Sam
当您需要向现有类添加功能时,可以使用继承或组合。例如,将TwigEnginePhpEngine传递到ProfilingEngine中。这样,您就可以灵活地包装任何引擎,而不会出现instanceof TwigEngine检查失败的情况。为了处理此检查,使用了EngineInterface - Im0rtality
只需在您的setter中添加断点,查看每个环境中传递给您的引擎类型。 - Im0rtality

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接