Подтвердить что ты не робот

Динамический CSS/Javascript в Twig с использованием Silex/SilexExtensions и Assetic

Что я хочу сделать: Получите свойства CSS из базы данных и выгрузите их в меньший файл. Затем примените фильтр сжатия less/yui на нем и выгрузите вывод в моем шаблоне ветки.


Позвольте мне сразу подойти к делу:

У меня есть веб-приложение PHP, использующее Silex и Twig в качестве механизма шаблонов. Чтобы обрабатывать и минимизировать файлы css/js, я пытаюсь использовать Assetic и Silex-Twig/Assetic-Extensions.

Я зарегистрировал расширения silex и установил фильтры, которые я хочу использовать. Теперь я не знаю, как сбрасывать файлы внутри моего шаблона ветки. Google Search держит меня в темноте. Поскольку свойства в файле lessfile могут меняться по запросу, я думаю, что нет способа статической доставки файлов.

Это моя реализация расширений silex:

$oApp = new Silex\Application();

//$oApp['autoloader']->registerNamespace('Assetic', DIR_VENDOR.'/assetic/src');
//$oApp['autoloader']->registerNamespace('SilexExtension', DIR_VENDOR.'/silex-extension/src');
//$oApp['autoloader']->registerNamespace('Twig', DIR_VENDOR.'/twig/lib');

$oApp->register(
    new Silex\Provider\TwigServiceProvider(), array(
        'twig.path' => DIR_ROOT.'/src/templates',
        'twig.class_path' => DIR_VENDOR.'/twig/lib',
    ),
    new SilexExtension\AsseticExtension(), array(
        'assetic.class_path' => DIR_VENDOR.'/assetic/src',
        'assetic.path_to_web' => DIR_ASSETS,
        'assetic.options' => array(
            'debug' => false,
            'formulae_cache_dir' => DIR_TMP.'/Assetic/cache',
            'twig_support' => true
        ),
        'assetic.filters' => $oApp->protect(function($fm) {
            $fm->set('yui_css', new Assetic\Filter\Yui\CssCompressorFilter(
                DIR_YUI.'/yuicompressor-2.4.7.jar'
            ));
            $fm->set('yui_js', new Assetic\Filter\Yui\JsCompressorFilter(
                DIR_YUI.'/yuicompressor-2.4.7.jar'
            ));
            $fm->set('googlecc_js', new Assetic\Filter\GoogleClosure\CompilerJarFilter(
                DIR_GOOGLE_CC.'/compiler.jar'
            ));
        }),
        'assetic.assets' => $oApp->protect(function($am, $fm) {
            $am>-set('styles', new Assetic\Asset\AssetCache(
                new Assetic\Asset\GlobAsset(
                    __DIR__ . '/resources/css/*.css',
                    array($fm->get('yui_css'))
                ),
                new Assetic\Cache\FilesystemCache(DIR_TMP.'/Assetic/cache')
            ));
            $am->get('styles')->setTargetPath(DIR_ASSETS.'/css/styles.css');
        })
    )
);

Поскольку файлы CSS обрабатываются с помощью меньшего фильтра (значения переменных должны поступать из базы данных), мне нужно сохранить/кэшировать выходной файл. Я думаю, что мне нужен LazyAssetManager в сочетании с AssetWriter, который записывает output.css в каталог кеша? Но я действительно изо всех сил стараюсь получить правильный синтаксис из моих шаблонов ветки. Следующая работа не работает:

{% stylesheets 'path/to/my/css' 'another/path/to/my/css' filter='yui_css' output='path/to/output/directory/styles.css' %}
<link href="{{ asset_url }}" rel="stylesheet" media="screen" />
{% endstylesheets %}

Я благодарен за каждую публикацию, касающуюся моей озабоченности.

4b9b3361

Ответ 1

Поскольку (вы упомянули), свойства в файле меньшего размера могут меняться в зависимости от запроса, я думаю, что вы пропустили утилизацию (и, возможно, даже меньше). Похоже, вы пытаетесь использовать assetic в качестве менее препроцессора, чего нет + нет причин для кэширования результата (это зависит от того, как часто они будут фактически различаться для каждого запроса).

Вы не можете подробно рассказать о том, чего хотите достичь, но я прикладываю к нему что-то вроде анимационного движка, где пользователи могут изменять свою цветовую схему (и другие переменные внешнего вида). Если это так, я думаю, вы должны поместить основную часть ваших файлов CSS/less в один шаблон, общий для всех запросов, а затем иметь маршрут в вашем приложении silex для доставки тематического css с переменными из базы данных.

Поскольку они могут быть разными для каждого запроса, я не думаю, что есть причина добавить меньше ресурсов для предварительной обработки на сервере для каждого запроса, поэтому вы должны вывести прямой CSS. В лучшем случае вы можете позволить клиенту обрабатывать бездействующие файлы, если вам это нравится.