在Symfony2中将变量传递给Assetic资产URL

13

有没有办法在模板中将变量传递给Assetic方法?

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

所以我想做的是从控制器中传递SOMEVAR


使用PHP作为模板语言,直接编写脚本。否则,在PHP中实现逻辑并将其注入到Twig语言中。 - hakre
5个回答

25

可以通过以下方式实现:

<link rel="stylesheet" href="{{ asset('bundles/yourbundle/css/'~ SOMEVAR ~'/css/' ) }}" />

6
这里并没有使用 assetic,而是使用了 Symfony 的 asset 函数。你无法在此使用过滤器。 - gondo

18

目前来说,我认为这是不可能的。原因是 Assetic 首先运行以转储资源,所以它不会运行 Twig 模板来计算变量。如果您在 PHP 模板中执行此操作,这可能是相同的。

这意味着运行时变量将不会被计算和扩展。因此,如果使用变量,则无法生成资产。这可能会在将来发生变化,但这将增加生产中每次用户请求资产时的开销,因为 Assetic 需要生成资产。

我知道可以通过直接使用 Assetic 中找到的代码(而不是使用 AsseticBundle)以编程方式定义和生成资产。您需要尝试、阅读源代码并进行反复试验来解决此问题。

目前几乎没有关于 Assetic 的文档。我能提供的唯一链接是 Assetic 在 github 页面上找到的 README,链接在这里。希望这很快就会改变。

希望这有所帮助。


3

稍微说明一下Chopchop的回答:

首先,您需要包含所有Assetic需要转储的文件,因为它需要知道您需要转储什么。您可以以条件方式在运行时包含资产本身。

因此,首先放置Assetic部分:

{% 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中也是一样的。


1

另一个选择是使用有限选项范围的方法(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 %}

...

那么,每个模块将在部署时被删除或由 assetic 动态处理,并且您可以使用 myVar 选择要包含的模块。
注意:我在此处使用了 javascripts 块,但样式表也可以这样做。

-1

也许我没理解对,但是……你是在尝试做这个吗?

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

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

无论如何,我认为拥有动态资产并不是一个好的做法。您到底想要实现什么?可能有更好的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接