Каталог должен существовать перед использованием в качестве параметра контейнера sf2

Какова лучшая практика для установки параметров контейнера, которые должны быть правильно настроены, например, у меня есть параметр с именем 'feed_filesystem_cache_path' (строка из каталога%kernel.cache_dir%' + /), который я вставляю в некоторые классы служб.

Я вижу себя проверяющим существование в этих классах и хотел бы знать, есть ли лучший способ сделать это.

Я пытался изменить расширение контейнера моего пакета, но кажется, что параметры не были разрешены к тому времени; Я все еще получаю "%kernel.cache_dir%/feeds" вместо полностью определенного / скомпилированного пути.

Попытки в классе Bundle, в методе сборки (сразу после parent::build($container) тоже мне мало помогают, на тот момент у контейнера только службы и параметры "ядра".

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 будет создан при выполнении cache:clear (без --no-прогрева) или cache:warmup команда.

Стоит отметить, что вы можете проверить в своем приложении, что каталог существует, чтобы предотвратить любую фатальную ошибку, если ваш кеш не прогрелся.

$filename = "/cache/dir/feeds/file";

if (!is_dir(dirname($filename))) {
    mkdir(dirname($filename));
}

Как сказал Тоуки, тайник с подогревом может помочь.

Другие вопросы по тегам