在 Symfony2 中使用 Twig 作为 JavaScript 的 Assetic 过滤器

2023-12-19

有没有办法使用 Twig 作为 Assetic 过滤器?

我想要做的是让 Twig 将我的 JavaScript 文件解析为 Twig 模板,然后将它们传递给 Assetic,以便它们在生产中进行组合和缩小。

您可能会挠头思考为什么我首先要这样做,所以让我跳到一个例子。


我正在用 JavaScript 制作一个游戏引擎,我需要几个“类”的两个版本。 一个版本供用户使用,另一个版本供编辑者使用。这些类之一的一个例子是单例World.

该类的用户版本可能如下所示:

var World = function()
{
    // bunch of 'private' variables and functions inside closure
    var _initialised = false;
    var _worldData;
    ...

    // public functions
    this.init = function(){...}
    this.update = function(){...}
    ...
}

此类的编辑器版本可能如下所示:

var World = function()
{
    // bunch of 'private' variables and functions inside closure
    var _initialised = false;
    var _worldData;
    ...

    // bunch of new private variables and functions for editing
    var _editorserver;
    ...

    // public functions
    this.init = function(){...}
    this.update = function(){...}
    ...

    // public functions that edit the world
    this.addEntity = function(){...}
    this.removeEntity = function(){...}
    ...
}

通过经典的面向对象继承,我们可以定义World作为一个类,然后用另一个类扩展它可编辑世界。然而,使用 JavaScript 中的原型继承,只会继承公共函数,如果您尝试扩展现有实例,您将无法访问闭包内的变量和函数。

Twig 来救援了!

使用 Twig,我们可以向文件中的任何类添加几个块,然后创建另一个文件,定义带有一些扩展名的同一类,然后包含that file.

那么让我们看看我们的基地World再次类作为 Twig 模板。

// world.js.twig
var World = function()
{
    // bunch of 'private' variables and functions inside closure
    var _initialised = false;
    var _worldData;
    ...

    {% block extended_privates %}{% endblock %}

    // public functions
    this.init = function(){...}
    this.update = function(){...}
    ...

    {% block extended_publics %}{% endblock %}
}

还有我们的扩展版本。

// editableworld.js.twig
{% extends "EngineBundle::world.js.twig" %}
var World = function()
{
    // bunch of 'private' variables and functions inside closure
    var _initialised = false;
    var _worldData;
    ...

    {% block extended_privates %}
    // bunch of new private variables and functions for editing
    var _editorserver;
    ...
    {% endblock %}

    // public functions
    this.init = function(){...}
    this.update = function(){...}
    ...

    {% block extended_publics %}
    // public functions that edit the world
    this.addEntity = function(){...}
    this.removeEntity = function(){...}
    ...
    {% endblock %}
}

现在问题是:如何让 Assetic 使用 Twig 作为过滤器,以便我可以执行如下操作:

// user version of twig template
// gameengine.html.twig

{% javascripts filter="js_twig_filter"
"@EngineBundle/Resources/public/js/world.js.twig"
%}
<script src="{{ asset_url }}" type="text/javascript"></script>
{% endjavascripts %}

// editor version of twig template
// gameeditor.html.twig

{% javascripts filter="js_twig_filter"
"@EngineBundle/Resources/public/js/editableworld.js.twig"
%}
<script src="{{ asset_url }}" type="text/javascript"></script>
{% endjavascripts %}

您可能想到的一个直接解决方案是完全放弃闭包,而将所有变量和函数公开,并在应该私有的变量和函数前面加上下划线。然而对我来说这不是一个有效的解决方案,因为我不仅仅是创建一个库。游戏引擎需要关闭最终用户的所有内部结构,以阻止所有想要篡改正在运行的引擎的用户(对于这些用户,我有适当的服务器验证,以确保来自受感染客户端的非法行为)不要通过服务器发送给其他客户端)。

感谢您的坚持,我希望有人可以帮助我(几天来我一直在尝试其他想法,然后才想到这个可能的解决方案)。


您需要首先渲染(在控制器中)所有 *.js.twig 文件并将它们保存为 *.js 文件(使用file_put_contents()在资源树中的某个位置运行)。然后将 *.js 文件加载到您的 assetic 过滤器中。

此外,您有很多库/语言/帮助程序可以优雅地支持 JavaScript 中的 OOP(例如 CoffeeScript、Backbone.js、Underscore.js 等)

祝你好运!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Symfony2 中使用 Twig 作为 JavaScript 的 Assetic 过滤器 的相关文章

随机推荐

  • PHP/Angularjs/发布数据为空

    我确实选择了两个字段 month and origin 以表格形式提交给AngularJS控制器 我使用的是与 Ionic 框架打包的 1 3 13 版本 观看一个console log inside then方法值已正确填充 The q
  • 在 Amazon EC2 上构建 gRPC 服务器

    当我尝试在 Amazon EC2 实例上构建 gRPC 服务器 客户端时遇到问题 我有一个实例 A 具有私有 ip 例如 1 2 3 4 服务器代码就像 from concurrent import futures import time
  • 没有共享窗口的山狮上的 NSSharingService

    在山狮上 我尝试使用 AppKit framework 的 NSSharingService 类来实现新的共享可能性 这种代码一切顺利 NSArray array myText NSImage imageNamed myImageFile
  • 扫描上传的文件 C# ASP.net

    我正在尝试对上传的文件进行病毒扫描 我无法控制已安装的病毒扫描程序 该产品由多方使用不同的扫描程序托管 我尝试了以下库 但它总是在 eicar 文件上返回 VirusNotFound https antivirusscanner codep
  • 如何设置MigraDoc的页面大小?

    抱歉 我只是 PDFsharp 的初学者 如何设置文档的PageSize 就说A4吧 怎么设置呢 这是我的代码 谢谢 Document document new Document Add a section to the document
  • 重复 UIAnimation 块,以及再次停止它的方法

    我想做一个小的加载器动画来放入我的应用程序中 我之前用 CGAnimations 做过重复动画 没有任何问题 这次我采用块方法 我正在做一个小测试 但可以重复以下代码 void startLoading block int count 0
  • 为什么 IE9/Firefox 显示的字体大小与其他浏览器不同?

    我正在对一个网站的 CSS 进行编程 并意识到 Internet Explorer 9 显示的字体大小与其他浏览器 Firefox Chrome Safari IE7 和 IE8 不同 我尝试过使用一些重置 并且我在中指定字体px 但IE9
  • 如何打印类型(Either String (IO String))?

    这是一个非常非常长的故事 我不会让你厌烦 但基本上 我设法让自己处于一种需要能够打印该类型的情况Either String IO String 有什么帮助吗 解决方案是单衬 either print print lt lt 如果你想区分它是
  • 滚动到下一个元素

    我正在努力解决 jquery 或 javascript 问题 它已经很烦人了 这告诉我我可能把这个问题想得太复杂了 所以我的标记 简单的 看起来像这样 div class container My Content a href class
  • 仅将字符串的第一个字母大写[重复]

    这个问题在这里已经有答案了 我已经看过这样的帖子 格式为首字母大写 http forums asp net t 1040231 aspx Format 20to 20first 20letter 20upper 20case 如何将字符串中
  • java比较两个Pattern对象

    有没有一种简单的方法可以比较两个Pattern物体 我有一个Pattern使用正则表达式编译 检查代码中的注释 由于有几个正则表达式来描述注释 我想找到一种方法来区分它们 如何做呢 这Pattern类没有实现equals method 你可
  • Google 货币转换器 API - 会随 iGoogle 一起关闭吗?

    iGoogle 是关闭 https support google com websearch answer 2664197 hl en 有一个 未记录 货币转换 API 其 URL 如下 此网址的基础 google com ig 将您带到
  • C++ 模板尖括号陷阱 - C++11 修复是什么?

    在 C 11 中 现在这是有效的语法 vector
  • 使用 md5 或 sha1 的密码散列仍然有效吗?

    我现在正在做一个金融项目 在这里 团队正在考虑使用MD5 for password hashing 但是 今天很容易复制SHA1 or MD5要解密的密码 包括复杂密码 例如 My uper ecur3PAS word 448 您可以使用在
  • 如何在android中的水平Linearlayout中显示两个带有椭圆形末端的Textview?

    我面临一个问题 那就是 我在一个水平 Linearlayout 中有两个 Textview 一个带有椭圆形结尾的 Textview 当我输入文本更多内容时 它会在 Textview 结尾中显示 但当时我无法显示第二个文本视图 Below I
  • jquery 文本区域的最大字符数

    我有以下代码 但我有点不知道下一步该做什么 这个想法是 当您在文本区域中输入文本时 计数器会告诉您还剩下多少个字符 一旦达到最大字符数 我想停止允许输入字符 或者删除所有输入的字符 这样文本区域中只有 10 个字符 我知道我必须把代码放在它
  • 从 InputConnection 获取 EditText 中所有文本的更好方法?

    我已经编写了一个 IME InputMethodService 我需要从它正在编辑的 EditText 中获取所有文本 我知道一种方法 InputConnection inputConnection getCurrentInputConne
  • 如何使用 Apache HTTPD 从 SSL 证书发送“主题备用名称”数据

    由于包含证书的智能卡 我的用户正在连接到我的应用程序 我正在使用 httpd 来确保证书有效 SSLCACertificateFile SRVROOT conf ssl certs usersCA crt 它工作正常 但我想知道我的用户在服
  • 从JS日期对象获取YYYYMMDD格式的字符串?

    我正在尝试使用 JS 来转date object到一个字符串中YYYYMMDD格式 有没有比串联更简单的方法Date getYear Date getMonth and Date getDay 修改了我经常使用的代码 Date protot
  • 在 Symfony2 中使用 Twig 作为 JavaScript 的 Assetic 过滤器

    有没有办法使用 Twig 作为 Assetic 过滤器 我想要做的是让 Twig 将我的 JavaScript 文件解析为 Twig 模板 然后将它们传递给 Assetic 以便它们在生产中进行组合和缩小 您可能会挠头思考为什么我首先要这样