如何使用Assetic与CacheBustingWorker和twig

时间:2013-01-18 12:45:14

标签: symfony twig assetic

我可以看到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?

5 个答案:

答案 0 :(得分:22)

缓存破坏者现在是symfony / AsseticBundle的一部分(版本&gt; = 2.5.0)。

在composer.json中更改AsseticBundle版本,如下所示:

"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

答案 1 :(得分:5)

我最近一直在寻找如何做同样的事情。

我提出的解决方案是使用我自己的类覆盖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));
    }
}

然后更改assetic.asset_factory.class参数以指向配置中的这个新类。在我的情况下,我将以下内容添加到config.yml:

parameters:
  assetic.asset_factory.class: YourSite\YourBundle\Factory\AssetFactory

答案 2 :(得分:4)

使用assetic的当前实现,我需要将您的代码更新为以下内容以使其工作。另请注意,如果您使用的是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))));
    }
}

希望这有助于某人

答案 3 :(得分:0)

随着资产代码再次更改,主分支上的LazyAssetManager不需要Stategy。

不要忘记更改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,以避免生成标准文件名。

答案 4 :(得分:0)

  getDateInRequiredFormat(d: Date): string {
    if (d instanceof Date) {
      let month: string | number = d.getMonth() + 1;
      if (month < 10) {
        month = '0' + month;
      }
      let day: string | number = d.getDate();
      if (day < 10) {
        day = '0' + day;
      }
      return `${d.getFullYear()}-${month}-${day}`;
    }
    return '';
  }

是答案。