Пользовательский фильтр Symfony2 не срабатывает с пользовательским тегом ветки

TL: DR; Добавление type="application/dart" заставляет Assetic игнорировать флаг фильтра filter=MyCustomFilter,

Удаление последнего триггера типа атрибута filter=MyCustomFilter просто хорошо. Но мне нужен фильтр и атрибут. Как я могу заставить Assetic запускать мой пользовательский фильтр, имея type=application/dart атрибут?

Я считаю, что часть проблемы заключается в том, что он принимает только type=application/javascript или пустой HTML type атрибут для фильтра для запуска. Я не уверен, куда идти отсюда.


Полная информация:

Я хочу сделать тег похожим на javascripts но для дартс файлов.

{% 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 атрибут для того, чтобы загрузчик работал.

Как только я добавляю обязательный атрибут, редактирование исходного файла не перекомпилируется. Это в значительной степени игнорируется. Следующий код игнорируется и не запускается MyCustomFilter фильтр:

{% darts '@MyBundle\...\main.dart' filter="MyCustomFilter" %}
<script type="application/dart" src="{{ asset_url }}"></script>

Кажется, я не могу найти, куда идти дальше, видя, как все это работает, само по себе ошеломляюще. Мне нужно только это признать type="application/dart так же верно, что мой MyCustomFilter срабатывает.

7

Решение

Я думаю, что есть очень простое решение для вашей проблемы, которое устраняет необходимость в новом {% 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 %}

Будет (в производственной среде) привести к:

<script type="application/dart" src="/dart/0b13818.dart"></script>

Эта функция описана Вот в документации Symfony, хотя в нем не упоминается тот факт, что вы можете изменить расширение.

Я только что провел быстрый тест в своем приложении Symfony, и оно, кажется, работает отлично.

3

Другие решения

Я предлагаю вам взглянуть на 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()
);

Что касается самого тега, вы можете скопировать / вставить его из сборочного комплекта. И получить некоторые объяснения о пользовательских тегах над одним из моих предыдущих ответов, Вот.

4