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