Как использовать Assetic с CacheBustingWorker и twig

Как я вижу, Assetic добился определенного прогресса в CacheBusting:
https://github.com/kriswallsmith/assetic#cache-busting

Но я действительно не понимаю, как мне это использовать.
Можно ли это использовать из ветки:

{% stylesheets 'bundles/mybundle/css/fonts.css' 
               'bundles/mybundle/css/style.css'
               'bundles/mybundle/css/screen.css'
               filter='cssrewrite'
 %}
    <link rel="stylesheet" type="text/css" href="{{ asset_url }}" />
{% endstylesheets %}

А обычной командой assetic:dump?

Где я должен подключить CacheBustingWorker?


person ivoba    schedule 18.01.2013    source источник


Ответы (5)


Cache buster теперь является частью symfony/AsseticBundle (версия >= 2.5.0).

Измените версию AsseticBundle в composer.json следующим образом:

"symfony/assetic-bundle": "2.5.0",

И активируйте очистку кеша для активов в вашем файле config.yml, как это

assetic:
    workers:
        cache_busting: ~

Мои файлы JS теперь выглядят так:

web/bundles/js/projectname-876f9ee.js

См. https://github.com/symfony/AsseticBundle/pull/119#issuecomment-28877145.

person Juergen    schedule 22.10.2014
comment
Это определенно должен быть ответ с самым высоким рейтингом. Супер простое решение, которое делает именно то, что я искал. Почему этого нет в документации Symfony? - person Rein Baarsma; 22.09.2015

Я недавно искал, как сделать то же самое.

Решение, которое я придумал, состояло в том, чтобы переопределить Symfony AssetFactory моим собственным классом и добавить CacheBustingWorker в его конструктор. В основном вы создаете файл, подобный следующему:

<?php
namespace YourSite\YourBundle\Factory;

use Symfony\Bundle\AsseticBundle\Factory\AssetFactory as BaseAssetFactory;
use Assetic\Factory\Worker\CacheBustingWorker;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpKernel\KernelInterface;

class AssetFactory extends BaseAssetFactory
{
    public function __construct(KernelInterface $kernel, ContainerInterface $container, ParameterBagInterface $parameterBag, $baseDir, $debug = false)
    {
        parent::__construct($kernel, $container, $parameterBag, $baseDir, $debug);
        // Add CacheBustingWorker
        $this->addWorker(new CacheBustingWorker(CacheBustingWorker::STRATEGY_CONTENT));
    }
}

а затем измените параметр assets.asset_factory.class, чтобы он указывал на этот новый класс в вашей конфигурации. В моем случае я добавил в config.yml следующее:

parameters:
  assetic.asset_factory.class: YourSite\YourBundle\Factory\AssetFactory
person Dimosthenis Nikoudis    schedule 02.02.2013
comment
спасибо, я также обнаружил, что ожидается PR для интеграции в AsseticBundle: github.com/symfony/AsseticBundle /тянуть/119 - person ivoba; 04.02.2013

С текущей реализацией актива мне нужно было обновить ваш код до следующего, чтобы заставить его работать. Также обратите внимание, если вы используете xdebug, вы должны увеличить максимальный уровень вложенности — xdebug.max_nesting_level = 200 до более чем 100.

<?php

namespace YourSite\YourBundle\Factory;

use Symfony\Bundle\AsseticBundle\Factory\AssetFactory as BaseAssetFactory;
use Assetic\Factory\LazyAssetManager;
use Assetic\Factory\Worker\CacheBustingWorker;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpKernel\KernelInterface;

class AssetFactory extends BaseAssetFactory
{
    public function __construct(KernelInterface $kernel, ContainerInterface $container, ParameterBagInterface $parameterBag, $baseDir, $debug = false)
    {
        parent::__construct($kernel, $container, $parameterBag, $baseDir, $debug);
        // Add CacheBustingWorker
        $this->addWorker(new CacheBustingWorker(new LazyAssetManager(new BaseAssetFactory($kernel, $container, $parameterBag, $baseDir, $debug))));
    }
}

Надеюсь, это поможет кому-то

person Peter    schedule 07.06.2013

Поскольку активный код снова изменился, нет необходимости в Stategy для LazyAssetManager в главной ветке.

Не забудьте изменить свой composer.json файл:

{
    "kriswallsmith/assetic": "dev-master@dev",
    "symfony/assetic-bundle": "dev-master@dev"
}

Теперь вам просто нужно это:

namespace YourSite\YourBundle\Factory;

use Symfony\Bundle\AsseticBundle\Factory\AssetFactory as BaseAssetFactory;
use Assetic\Factory\Worker\CacheBustingWorker;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\HttpKernel\KernelInterface;

class AssetFactory extends BaseAssetFactory
{
    public function __construct(
        KernelInterface $kernel,
        ContainerInterface $container,
        ParameterBagInterface $parameterBag,
        $baseDir,
        $debug = false
    ) { 
        parent::__construct($kernel, $container, $parameterBag, $baseDir, $debug);
        // Add CacheBustingWorker
        $this->addWorker(new CacheBustingWorker());
    }
} 

Не забудьте php app/console cache:clear -e prod перед однократным сбросом ресурсов, чтобы избежать создания стандартных имен файлов.

person Julien Deniau    schedule 21.10.2013

assetic:
    workers:
        cache_busting: ~

Это ответ.

person nico0205    schedule 10.07.2019
comment
Да, это уже есть в ответе Юргена. Я изменил его на принятый ответ. - person ivoba; 11.07.2019