TL:DR; 添加type="application/dart"
会使Assetic忽略过滤器标记filter=MyCustomFilter
。
删除后一种属性类型会触发filter=MyCustomFilter
就好了。但我需要过滤器和属性。如何在具有type=application/dart
属性的情况下使Assetic触发我的自定义过滤器?
我认为部分问题在于它只接受type=application/javascript
或空的html type
属性才能触发过滤器。我不知道从哪里开始。
我想创建一个类似于javascripts
的标签,但是对于Dart文件。
{% darts
'@AcmeBundle/Resources/dart/AcmeMain/web/main.dart'
%}$
<script type="application/dart" src="{{ asset_url }}"></script>
{% enddarts %}
我希望能够使用@
表示法而不是/bundles/etc/
经过一番搜索后,我尝试了以下内容:
我延长了Symfony\Bundle\AsseticBundle\Twig\AsseticExtension
我继承了以下功能:
public function getTokenParsers()
{
return array(
$this->createTokenParser('javascripts', 'js/*.js'),
$this->createTokenParser('stylesheets', 'css/*.css'),
$this->createTokenParser('image', 'images/*', true),
);
}
在我自己的子类中,我添加到父数组$this->createTokenParser('darts', 'dart/*.dart')
。
最初,当我有这个时,这是有效的。
{% darts '@MyBundle\...\main.dart' filter="MyCustomFilter" %}
<script src="{{ asset_url }}"></script>
但是,引导加载程序dart.js
需要type="application/dart
属性才能使引导程序正常工作。
只要添加required属性,编辑源文件就不会重新编译。它几乎被忽略了。以下代码将被忽略,并且不会触发MyCustomFilter
过滤器:
{% darts '@MyBundle\...\main.dart' filter="MyCustomFilter" %}
<script type="application/dart" src="{{ asset_url }}"></script>
我似乎无法从这里找到下一步的地方,看看这一切是如何起作用本身就是非常强大的。我只需要将type="application/dart
识别为有效,以便我的MyCustomFilter
被触发。
答案 0 :(得分:4)
我建议您查看vendor/symfony/assetic-bundle/
个文件,因为它包含{% javascripts %}
实现。
从该捆绑包Resources/config/templating_twig.yml
开始,他们会注入一个名为@templating.name_parser
的服务,看起来就像您正在寻找的那样。
您可以在控制器中试一试:
var_dump(
$this
->get('templating.name_parser')
->parse('@AcmeBundle/Resources/dart/AcmeMain/web/main.dart')
->getPath()
);
关于标记本身,您可以从资产包中大量复制/粘贴。并通过我以前的一个答案here获得有关自定义标记的一些解释。
答案 1 :(得分:3)
我认为您的问题有一个非常简单的解决方案,无需使用新的{% darts %}
代码。
在Assetic标记中,您可以指定output
参数,该参数允许您覆盖默认输出路径(在js/*.js
标记的情况下为{% javascripts %}
)。通过将output
设置为dart/*.dart
,您不仅可以更改存储文件的目录,还可以更改文件扩展名。
示例:
{% javascripts '@AcmeBundle/Resources/dart/AcmeMain/web/main.dart' filter="MyCustomFilter" output='dart/*.dart' %}
<script type="application/dart" src="{{ asset_url }}"></script>
{% endjavascripts %}
Will(在生产环境中)会导致:
<script type="application/dart" src="/dart/0b13818.dart"></script>
Symfony文档中描述了此功能here,但没有提及您可以更改扩展名的事实。
我刚刚在我的Symfony应用程序中运行了一个快速测试,它看起来效果很好。