是否有办法将变量传递给模板中的Assetic方法
{% stylesheets
'@SomeExampleBundle/Resources/views/ SOMEVAR /css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
我要做的就是从控制器传递SOMEVAR
通过这种方式是可能的:
<link rel="stylesheet" href="{{ asset('bundles/yourbundle/css/'~ SOMEVAR ~'/css/' ) }}" />
目前,我认为这根本不可能。这背后的原因是Assetic
提前运行以转储资产,因此它不运行Twig模板来计算变量。如果您在PHP模板中执行此操作,则可能是相同的。
这意味着运行时变量将不会被计算和展开。因此,如果使用了变量,则不可能生成资产。这在将来可能会改变,但是这将在每次用户请求资产时产生开销,因为Assetic
将需要生成资产。
我知道可以通过直接使用在Assetic
中发现的代码以编程方式定义和生成资产(而不是使用AsseticBundle
)。您需要进行实验,阅读源代码,并进行试验和错误来解决这个问题。
目前关于Assetic
的文档很少甚至没有。我能给出的唯一链接是在github页面上找到的README
。我希望这种情况能很快改变。
详细说明一下Chopchop的回答:
首先,您需要包含asset需要转储的所有文件,因为它需要知道您需要转储哪些文件。你可以用有条件的方式在运行时包含资源本身。
首先输入资产部分:
{% javascripts
'@ExampleComBundle/Resources/public/js/module1.js'
'@ExampleComBundle/Resources/public/js/module2.js'
%}
{% endjavascripts %}
现在你可以输入你想要的条件了。这两个脚本都将在部署时被转储,但您可以在运行时选择包含哪一个:
<link rel="stylesheet" href="{{ asset('bundles/examplecombundle/js/module' ~ WHICH_MODULE_TO_INCLUDE ~ '.js ) }}" />
~字符只是Twig模板中的连接操作符。
对于CSS和JS来说当然是一样的
另一种选择,它适用于有限范围的选项(Piotr的解决方案在开发模式下不适合我):
{% javascripts
'@AcmeDemoBundle/Resources/public/js/module_A.js'
output='js/module_A.js'
%}
{% if myVar == "A" %}
<script src="{{ asset_url }}"></script>
{% endif %}
{% endjavascripts %}
{% javascripts
'@AcmeDemoBundle/Resources/public/js/submodule1_B.js'
'@AcmeDemoBundle/Resources/public/js/submodule2_B.js'
'@AcmeDemoBundle/Resources/public/js/submodule3_B.js'
output='js/module_B.js'
%}
{% if myVar == "B" %}
<script src="{{ asset_url }}"></script>
{% endif %}
{% endjavascripts %}
...
这样,每个模块将被转储到部署中或由asset动态处理,并且您可以使用myVar选择要包含的模块。
也许我没有理解,但是…你想这么做吗?
{% stylesheets
'@SomeExampleBundle/Resources/views/' ~ somevar ~ '/css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
因为,据我所知,传递给stylesheets
的字符串是一个有效的Twig表达式,所以你可以自由地使用变量插值。
无论如何,我不认为拥有动态资产是一个好的实践。你到底想达到什么目标?也许有更好的解决办法。