You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Twig渲染为HTML文件添加变量时如何避免重复代码?

优化实现方案

核心优化说明

本次优化在完全保留原有业务逻辑的前提下,解决重复代码、冗余本地IO问题,同时修复潜在的路径不匹配bug:

  • 抽离Twig渲染的公共参数,避免重复编写相同配置代码
  • 移除不必要的本地临时文件读写,直接使用渲染得到的HTML字符串上传S3,降低磁盘IO开销
  • 修正原代码中S3存储路径与访问路径不一致的问题(原代码上传到users/目录,访问链接拼接的是emails/前缀,会导致访问404,可根据实际业务需求调整路径)

优化后代码实现

// 抽离公共模板参数,后续只需要维护这一份配置即可
$commonTplParams = [
    'user' => $admin,
    'avatar' => AmazonS3Service::URL_PREFIX . $admin->getPhoto()
];
$s3 = $this->container->get('s3storage');

// 第一次渲染:生成不带在线查看入口的S3存储版本
$s3HtmlContent = $this->twig->render(
    'EmailRo/incomplete-listing-moderation/accept-incomplete-listing.email.twig',
    $commonTplParams + ['s3html' => '']
);

// 生成全局唯一的存储文件名,相比原随机数+时间戳的方式冲突概率更低
$fileName = 'incomplete_listing_accept_' . uniqid() . '_' . time() . '.html';
$fileS3Path = 'emails/' . $fileName;

// 直接上传内存中的HTML字符串,无需写入本地磁盘再读取
$s3->upload(
    $fileS3Path,
    $s3HtmlContent,
    'text/html'
);
$onlineViewUrl = AmazonS3Service::URL_PREFIX . $fileS3Path;

// 第二次渲染:生成携带在线查看入口的最终发件内容
$emailBody = $this->twig->render(
    'EmailRo/incomplete-listing-moderation/accept-incomplete-listing.email.twig',
    $commonTplParams + ['s3html' => $onlineViewUrl]
);

可选进阶优化(消除二次渲染开销)

如果允许调整Twig模板结构,可以将邮件核心内容抽为独立区块,仅渲染一次核心内容即可,进一步降低Twig的渲染性能损耗:

调整后的Twig模板示例

{# 抽离所有邮件主体内容为独立区块 #}
{% block email_main_content %}
<!-- 这里放原有模板除了在线查看入口之外的所有内容 -->
{% endblock %}

{# 在线查看入口仅在参数存在时渲染 #}
{% if s3html %}
<a href="{{ s3html }}" style="text-decoration: none;"><span style="font-family:'Montserrat','Arial','Helvetica', sans-serif !important; font-weight: normal; font-size:13px; line-height: 15px; color: #27AAE1; font-weight: 400;">
Email not displayed correctly? Read the online version in your browser.
</span></a>
{% endif %}

{# 渲染核心邮件内容 #}
{{ block('email_main_content') }}

内容的提问来源于stack exchange,提问作者C.Astraea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 09:15:07