我可以看到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?
答案 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 '';
}
是答案。