使用 Symfony Mailer 在 Twig 的模板化电子邮件中嵌入 Webpack 资产

emi*_*mix 2 php symfony twig webpack-encore

该Symfony的的邮件文件说,人们可以很容易嵌入图像:

<img
    src="{{ email.image('@images/logo.png') }}"
    alt="Logo">
Run Code Online (Sandbox Code Playgroud)

但是,我的所有资产都是由 Webpack 和 Encore 构建的。我也使用资产清单文件,因为每个资产的名称中都有一个 chunkhash。

在这种情况下如何使用 Twig 嵌入图像?我试过:

<img
    src="{{ email.image(asset('build/images/logo.png')) }}"
    alt="Logo">
Run Code Online (Sandbox Code Playgroud)

但这不起作用。我最终得到一个“模板丢失”的异常。如果我使用来自静态位置的图像,这当然很有效。

yce*_*uto 6

正如文档所说:定义一个 Twig 命名空间,指向您的图像存储在的任何目录,例如:

# config/packages/twig.yaml
twig:
    paths:
        # point this wherever your images live
        public/build/: build
Run Code Online (Sandbox Code Playgroud)

接下来,在您的电子邮件模板中:

{# '@build/' refers to the Twig namespace defined earlier #}
<img src="{{ email.image('@build/logo.png') }}" alt="Logo">
<img src="{{ email.image('@build/subdir/logo.png') }}" alt="Logo">
Run Code Online (Sandbox Code Playgroud)

如果构造的图像具有一些随机后缀,例如 when.enableVersioning()在webpack.config.js配置文件中定义,则这将不起作用。


如果您启用了版本控制策略,您可以执行以下操作:

# config/packages/twig.yaml
twig:
    paths:
        public/: public
Run Code Online (Sandbox Code Playgroud)

并使用字符串 concat 运算符构建模板名称~:

{# '@public' refers to the Twig namespace defined earlier #}
<img src="{{ email.image('@public' ~ asset('build/logo.png')) }}" alt="Logo">
Run Code Online (Sandbox Code Playgroud)