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

如何在Shopware中程序化运行Twig解释器并加载sw_sanitize过滤器

问题:在Shopware环境中运行含自定义Twig过滤器的代码

需求

我需要在Shopware环境中渲染以下Twig表达式:

{{ page.product.translated.description|raw|striptags|sw_sanitize|u.truncate(125, '…') }}

由于TwigFiddle不支持sw_sanitize过滤器,因此希望通过程序化方式运行Twig解释器测试这段逻辑。

已尝试的代码

我编写了以下代码,但无法加载sw_sanitize过滤器:

var_dump($container->getParameter('kernel.shopware_version'));

$loader = new \Twig\Loader\ArrayLoader([
    'template.twig' => "Hello {{ name|raw|striptags|sw_sanitize|u.truncate(125, '…') }}!",
]);
$twig = new \Twig\Environment($loader);

echo $twig->render('template.twig', ['name' => ' foo ']);

报错信息

运行后抛出错误:

Unknown "sw_sanitize" filter in "template.twig" at line 1.

解决方案

问题根源

sw_sanitize和u.truncate是Shopware自定义的Twig过滤器,不属于Twig核心功能。直接初始化原生Twig环境不会自动加载这些Shopware扩展。

正确实现方式

方式1:使用Shopware容器获取已配置的Twig实例(推荐)

Shopware启动时已将包含所有自定义过滤器、扩展的Twig实例注入到容器中,直接调用即可:

// 从Shopware容器中获取预配置的Twig环境
$twig = $container->get('twig');

// 渲染模板
echo $twig->render('template.twig', ['name' => ' foo ']);

方式2:手动注册Shopware自定义过滤器(仅特殊场景使用)

如果必须手动初始化Twig环境,需手动注册对应的Shopware过滤器类:

$loader = new \Twig\Loader\ArrayLoader([
    'template.twig' => "Hello {{ name|raw|striptags|sw_sanitize|u.truncate(125, '…') }}!",
]);
$twig = new \Twig\Environment($loader);

// 注册sw_sanitize过滤器
$twig->addFilter(new \Twig\TwigFilter('sw_sanitize', [\Shopware\Core\Framework\Twig\Filter\SanitizeTwigFilter::class, 'sanitize']));

// 注册u.truncate过滤器
$twig->addFilter(new \Twig\TwigFilter('u.truncate', [\Shopware\Core\Framework\Twig\Filter\StringTwigFilter::class, 'truncate']));

echo $twig->render('template.twig', ['name' => ' foo ']);

注意事项

  • 方式1是Shopware开发的标准做法,容器中的Twig实例完全匹配前端模板的运行环境,包含所有Shopware自带的过滤器、函数和全局变量。
  • 方式2需确保过滤器类路径正确,且依赖的服务(如Sanitizer服务)已初始化,否则可能出现依赖缺失错误。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 03:15:11