设置需要正确设置的容器参数的最佳做法是什么,例如我有一个名为'feed_filesystem_cache_path'的参数('%kernel.cache_dir%'+ /目录位置的字符串),我将其注入某些服务类。
我看到自己检查这些课程中的存在,并想知道是否有更好的方法来做到这一点。
我试图改变我的bundle的容器扩展,但似乎那时参数没有解决;我仍然得到'%kernel.cache_dir%/ feeds'而不是完全限定/编译的路径。
尝试在Bundle类中,在构建方法中(就在parent :: build($ container)之后也没有帮助我,在那时容器只有“内核”服务和参数。
答案 0 :(得分:2)
将我的评论转换为答案,以便对此问题做出正确的回复
这样做的可行方法是创建Cache Warmer
为此,您需要创建一项新服务,并使用kernel.cache_warmer
的 services.yml 强>
services:
acme_foo.my_warmer:
class: Acme\FooBundle\CacheWarmer
arguments:
- @filesystem
tags:
- name: kernel.cache_warmer
- priority: 0
缓存加热器必须实现CacheWarmerInterface。
namespace Acme\FooBundle;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpKernel\CacheWarmer\CacheWarmerInterface
class CacheWarmer implements CacheWarmerInterface
{
protected $filesystem;
public function __construct(Filesystem $filesystem)
{
$this->filesystem = $filesystem;
}
/**
* {@inheritDoc}
*/
public function warmUp($cacheDir)
{
$real = sprintf("%s/feeds", $cacheDir);
$this->filesystem->mkdir($real);
}
/**
* {@inheritDoc}
*/
public function isOptional()
{
return true;
}
}
使用此组件,当您执行/feeds
(不使用--no-warmup)或cache:clear
命令时,将创建目录cache:warmup
。
值得一提的是,您可以在您的应用程序中检查该目录是否存在,以防止在您的缓存尚未预热时出现任何致命错误
$filename = "/cache/dir/feeds/file";
if (!is_dir(dirname($filename))) {
mkdir(dirname($filename));
}
答案 1 :(得分:0)
正如Touki所说,缓存加热器可能会起到作用。