Каталог должен существовать перед использованием в качестве параметра контейнера 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));
}