自定义Symfony2过滤器不使用自定义树枝标记触发

时间:2015-01-15 18:43:09

标签: php symfony dart twig assetic

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被触发。

2 个答案:

答案 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应用程序中运行了一个快速测试,它看起来效果很好。