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
срабатывает.
Я думаю, что есть очень простое решение для вашей проблемы, которое устраняет необходимость в новом {% 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, и оно, кажется, работает отлично.
Я предлагаю вам взглянуть на 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()
);
Что касается самого тега, вы можете скопировать / вставить его из сборочного комплекта. И получить некоторые объяснения о пользовательских тегах над одним из моих предыдущих ответов, Вот.