【问题标题】:How to extend the html Twig escaper?如何扩展 html Twig 转义器?
【发布时间】:2018-09-25 15:50:46
【问题描述】:

我正在逐步将现有的 Symfony 应用程序迁移到 VueJS。

我最近发现的问题是 {{ stuff }} 标记总是由 VueJS 解释,即使内容来自渲染的 twig 变量。

为避免这种情况,我想扩展 html 转义符,以分别用 {} html 代码替换 {}

我怎样才能正确地做到这一点?转义在 twig_escape_filter 内部,没有我可以覆盖的服务。

我还尝试制作自定义逃生策略猜测器,返回我的 vue 转义,在替换所需字符之前,它本身调用 twig_escape_filterhtml 转义。我所有的源代码都被转义了。 :-D

感谢您的帮助。

【问题讨论】:

    标签: symfony vue.js twig


    【解决方案1】:

    事实上,你可以在你的 javascript 中解决这个问题,就这么简单:

    import Vue from 'vue';
    
    Vue.options.delimiters = ['${', '}'];
    

    现在您可以像以前一样对树枝使用双括号 ({{ }}),对 VueJ 使用 ${ }

    编辑:你想做的事是不可能的。您确实可以使用这样的简单过滤器将{{ }} 转换为相应的html实体:

    new \Twig_Filter('yourFilter', function ($string) {
        return htmlentities($string, ENT_HTML5);
    }, ['is_safe' => ['html']])
    

    但是由于 Vue 在你渲染的 html 之上运行,你呈现的冲突仍然会发生(因为 html 会将这些 html 实体渲染为括号)。

    您唯一的解决方案是像这样为您的 Vue 使用更具体的分隔符,以避免这种冲突:

    Vue.options.delimiters = ['$vue{', '}'];
    

    【讨论】:

    • 抱歉,这根本没有帮助。这不是 Twig 冲突问题,而是关于数据库中的内容显示。并非所有应用程序都迁移到 vue,并且某些数据库内容可能包含分隔符。因此,如果客户在文本中打开带有${ something } 的票证,我将遇到完全相同的问题。
    • 这就是为什么我需要将{} 从twig 中转义。
    • 我编辑了我的答案以更好地解释我提出的解决方案。
    • 我不会为此使用花哨的分隔符,抱歉。这是一种解决方法。 :-) 为什么我的需求是不可能的? Twig_Extension_Core::setEscaper 方法存在,所以我认为我们可以。我现在真的不知道如何,这就是为什么要问。 ;-)
    • 我知道了,谢谢!但我想成为 html 的默认转义符。谢谢你的时间顺便说一句。
    猜你喜欢
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2014-11-14
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多