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

