将变量传递给Symfony2中的asset资产URL


Pass a variable to an Assetic asset URL in Symfony2

是否有办法将变量传递给模板中的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选择要包含的模块。

注意:我在这里使用了javascripts块,但它与样式表的工作原理相同。

也许我没有理解,但是…你想这么做吗?

{% stylesheets
    '@SomeExampleBundle/Resources/views/' ~ somevar ~ '/css/*'
%}
<link rel="stylesheet" href="{{ asset_url }}" />
{% endstylesheets %}

因为,据我所知,传递给stylesheets的字符串是一个有效的Twig表达式,所以你可以自由地使用变量插值。

无论如何,我不认为拥有动态资产是一个好的实践。你到底想达到什么目标?也许有更好的解决办法。