在用作sf2容器参数之前,目录需要存在

时间:2014-03-06 14:11:38

标签: symfony caching dependencies bundle code-injection

设置需要正确设置的容器参数的最佳做法是什么,例如我有一个名为'feed_filesystem_cache_path'的参数('%kernel.cache_dir%'+ /目录位置的字符串),我将其注入某些服务类。

我看到自己检查这些课程中的存在,并想知道是否有更好的方法来做到这一点。

我试图改变我的bundle的容器扩展,但似乎那时参数没有解决;我仍然得到'%kernel.cache_dir%/ feeds'而不是完全限定/编译的路径。

尝试在Bundle类中,在构建方法中(就在parent :: build($ container)之后也没有帮助我,在那时容器只有“内核”服务和参数。

2 个答案:

答案 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所说,缓存加热器可能会起到作用。