2015-08-06 1 views
4

Это:Переопределение значения parameters.yml динамически после запуска композитор установки в Symfony

parameters_dev.yml.dist 
    my_key: todays_timestamp_{$timestamp} 

будет генерировать:

parameters.yml 
    my_key: todays_timestamp_9845712365 

после запуска composer install

Возможно ли это или еще какой-нибудь обходной путь? То, чего я пытаюсь достичь, каждый раз, когда я запускаю composer install, my_key будет иметь уникальное значение.


UPDATE

config.yml

doctrine_cache: 
    providers: 
     my_memcached_cache: 
      namespace: %cache_namespace% 

parameters.yml

parameters: 
    cache_namespace: todays_timestamp_ 

Memcache статистика всегда будет выглядеть следующим образом:

Server 127.0.0.1:11211 
stats cachedump 12 100 

Server 127.0.0.1:11211 
ITEM todays_timestamp_[My\Bundle\Acc][1] [1807 b; 1438597305 s] 
ITEM todays_timestamp_[My\Bundle\Mer][1] [1707 b; 1438597305 s] 
..... 
..... 
END 

, но я хочу, чтобы todays_timestamp_ был изменен все время с прикреплением к нему уникального суффикса.

+1

На проде ваших параметры и контейнер будут построены только один раз, так что вы можете создать параметр в расширении и это будет происходить только на один раз в Deploy/кэше-разминке. – qooplmao

+0

Значит, мне нужна была такая вещь.Каждый раз, когда приложение развертывается в prod, stag и т. Д. С capifony или что-то еще, это значение в параметрах.yml должно измениться. – BentCoder

+0

Но с 'capifony' ваши параметры должны быть в общем файле, поэтому вы каждый раз редактируете свой единственный файл параметров. То, что вы на самом деле хотите сделать с этим .. за пределами есть уникальный ключ. Какова цель ключа? – qooplmao

ответ

6

Поскольку параметры вашего контейнера обычно создаются только при нагреве кеша, вы можете создать параметр в своем XxxExtension при каждом развертывании. Отсюда вы можете использовать prepend свою конфигурацию для doctrine_cache, а не для того, чтобы сделать это наоборот.

В вашем расширении вы можете сделать следующее ...

namespace Acme\HelloBundle\DependencyInjection; 

use Symfony\Component\HttpKernel\DependencyInjection\Extension; 
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 

// implement the PrependExtensionInterface so it gets picked up by the DI 
class AcmeHelloExtension extends Extension implements PrependExtensionInterface 
{ 
    // Add your usual extension stuff 

    // add the prepend method to prepend your config onto the doctrine_cache config 
    public function prepend(ContainerBuilder $container) 
    { 
     // check for the presence of the doctrine_cache bundle and throw an exception 
     if (!$container->hasExtension('doctrine_cache')) { 
      throw new \Exception('DoctrineCacheBundle must be registered in kernel'); 
     } 

     // add your config with your timestamp to the doctrine_cache config 
     $container->prependExtensionConfig(
      'doctrine_cache', 
      array(
       'providers' => array(
        'my_memcached_cache' => array(
         'namespace' => sprintf(
          // your cache key with timestamp 
          'memcache_timestamp_%s', 
          \DateTime::getTimestamp() 
         ), 
        ), 
       ), 
      ) 
     ); 
    } 
} 

Таким образом, каждый раз, когда контейнер собран он должен восстановить конфигурации для doctrine_cache с датируемым ключом кэша обновляется на «сейчас» вам мешает нуждаясь зацепиться за обновления композитора или что-то в этом роде.

Для получения дополнительной информации о PrependExtension stuff check out the docs.

+0

Спасибо. Я попробую завтра и обновить вас. Также было нужно, чтобы 'if()' заявление было необходимо? Почему мы проверяем манго? – BentCoder

+0

Извините, я скопировал его из моего собственного кода. 'If ​​()' не является полностью необходимым, но может быть удобным в будущем. Без этого проверьте, что ваш конфиг просто добавит ключ 'doctrine_cache', означающий, что если по какой-то причине вы удалили DoctrineCacheBundle, вы просто получили бы ошибки, говорящие что-то вроде' Нет расширения, которое может загрузить конфигурацию для "doctrine_cache" чем возможность указать, где добавляется конфиг. – qooplmao

+0

Я буду использовать это, потому что он работал так, как хотелось, плюс 1 и спасибо. – BentCoder

4

Я тоже думаю, что для управления версиями активов. Практически, я предлагаю вам следующий подход:

<?php 
// app/config/cache_namespace_version.php 
     $container->loadFromExtension('doctrine_cache', array(
       'providers' => array(
        'my_memcached_cache' => array(
         'namespace' => exec('git rev-parse --short HEAD'), // Or the current timestamp 
        ), 
       ))); 

и импорта в config_prod.ml

# app/config/config.yml 

imports: 
    - { resource: config.yml } 
    - { resource: cache_namespace_version.php } 

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

Убедитесь, что я ввел в контейнер правильный ключ doctrine_cache. Вдохновленный this article

Надеется, что это помощь

+0

Я запомню и запомню этот вариант где-нибудь, потому что это интересно. Плюс 1. – BentCoder

Смежные вопросы