有没有办法将变量传递给模板中的 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
。我可以提供的唯一链接是在README
Assetic 的 github 页面上找到的。我希望这会很快改变。
希望这可以帮助。
详细说明 Chopchop 的回答:
首先,您需要包含资产需要转储的所有文件,因为它需要知道您需要转储的内容。您可以有条件地做的是在运行时包含资产本身。
所以首先放入资产部分:
{% 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 %}
...
这样,每个模块将在部署时转储或由资产动态处理,并且您可以使用myVar选择要包含的模块。
注意:我在这里使用了 javascripts 块,但它与样式表的工作方式相同。
也许我不明白,但是……你是想这样做吗?
{% stylesheets
'@SomeExampleBundle/Resources/views/' ~ somevar ~ '/css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}
因为据我所知,传递给的字符串stylesheets
是有效的 Twig 表达式,因此您可以自由使用变量插值。
无论如何,我认为拥有动态资产不是一个好习惯。你到底想达到什么目的?可能有更好的解决方案。