【问题标题】:Symfony2 / Twig: How to force rerender of single template?Symfony2 / Twig:如何强制重新渲染单个模板?
【发布时间】:2014-02-10 01:42:56
【问题描述】:

我有一个 Symfony 项目,它还发送一些标准电子邮件,例如“尊敬的用户 XYZ,请查找附件”等 - 这些电子邮件的内容存储在 Twig 模板中,例如 yourfile.html.twig。管理员可以在一个简单的 Web 界面中更改那些基本的“文本文件”。任何更改都会写回文件。电子邮件是使用 SwiftMailer 发送的,就像在他们的文档中的示例代码中一样,带有指向 twig 模板的文件路径。

这在调试环境中运行良好 - 因为 Twig 会自动重新呈现已更改的缓存文件。但是,当我在生产环境中时,这不再起作用。 Twig 无法识别对邮件模板所做的更改,它使用缓存版本(因此用户会收到一封包含旧版本文本的电子邮件)。

解决此问题的一种方法是在管理员每次更改电子邮件模板时清除缓存(这种情况不会经常发生)。无论如何,我不喜欢这种方式,因为它会强制重新渲染每个页面,这只是浪费资源......

另一种可能性是在生产环境中也启用 Twig 的“自动重新渲染”功能,但我再次对这个解决方案不满意,因为它会导致性能损失......

执行此操作的“最佳”方法是调用某个函数来重新呈现已更改的文件(伪代码:twig->rerender("path/to/file/yourfile.html.twig")) ,但我找不到任何方法来实现这一点。也许我只是用了错误的关键字进行搜索?

如果有人知道如何解决上述问题,我将不胜感激!

提前致谢, katze_sonne

【问题讨论】:

标签: php templates symfony twig


【解决方案1】:

您可以将信件的文本存储在数据库中。例如,在树枝中,您将只有 {{letter}}。你的问题就会消失。我认为这种方式更有用。而且您不需要重写项目文件夹中的文件,在服务器上可能会出现一些问题。

您可以通过命令发送电子邮件的另一种变体。命令始终在 dev 环境中执行,因此它将获得文件的非缓存副本。如果您从控制器发送信件,您可以使用How can I run symfony 2 run command from controller

【讨论】:

  • 感谢您的建议。我明天将尝试实施它。我认为如果我将文本存储在文本文件而不是数据库中并没有真正的区别,所以我会先尝试这种方式(我不想改变太多)。现在我只是想知道如何处理替换。例如。我在电子邮件模板中使用了 twig 变量“{{username}}”。但是 PHP 的一个简单的 str_replace 可能会在这里有所帮助......现在还发现了这个关键字“数据库”,这可能会导致目标:twig.sensiolabs.org/doc/… 谢谢!
猜你喜欢
  • 1970-01-01
  • 2015-05-22
  • 2021-12-11
  • 1970-01-01
  • 2015-12-22
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
相关资源
最近更新 更多