为什么Symfony';s@templating服务在dev和prod中提供不同的类?
我有一个服务在dev中运行得很好。它看起来有点像这样:为什么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
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
myconfig.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中添加断点,然后查看在每个环境中通过的引擎类型。