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
相关产品推荐
相关产品推荐

