2011-09-07 75 views
14

我想製作一個本地配置文件config_local.yml,它允許在不破壞其他人的開發環境的情況下正確配置每個開發環境。我希望它是一個單獨的文件,以便我可以「gitignore」它,並知道項目中沒有任何必要的東西,同時沒有git問題不斷告訴我config_dev.yml有新的變化(並且運行風險有人實施這些改變)。我可以在Symfony2中包含一個可選的配置文件嗎?

現在,我已經做config_dev.yml

imports: 
    - { resource: config_local.yml } 

這是偉大的,除非該文件不存在(即存儲庫的一個新的克隆)。

我的問題是:有沒有什麼辦法可以使這包括可選的?即,如果文件存在然後導入它,否則忽略它。

編輯:我希望的語法,如:

imports: 
    - { resource: config.yml } 
    ? { resource: config_local.yml } 

回答

8

一個解決方案是創建一個單獨的環境,這是在Symfony2中cookbook解釋。如果你不想創建一個擴展,還有另外一種方法可以創建擴展。

// src/Acme/Bundle/AcmeDemo/DepencendyInjection/AcmeDemoExtension.php 
namespace Acme\DemoBundle\DependencyInjection; 

use Symfony\Component\Config\FileLocator; 
use Symfony\Component\DependencyInjection\ContainerBuilder; 
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader; 
use Symfony\Component\HttpKernel\DependencyInjection\Extension; 

class AcmeDemoExtension extends Extension 
{ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     // All following files will be loaded from the configuration directory 
     // of your bundle. You may change the location to /app/ of course. 
     $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); 

     try 
     { 
      $loader->load('config_local.yml'); 
     } 
     catch(\InvalidArgumentException $e) 
     { 
      // File was not found 
     } 
    } 
} 

在Symfony的代碼一些挖掘發現我 YamlFileLoader::load() FileLocator::locate()將拋出\InvalidArgumentException,如果沒有找到一個文件。它由YamlFileLoader::load()調用。

如果使用命名約定,則擴展名將自動執行。有關更詳盡的解釋,請參閱visit this blog

+1

你的回答讓我想,也許他可以創建自己的'YamlFileLoader',如果無法找到yml文件,將會優雅地失敗。 –

+1

非常好的答案,謝謝。我希望我能給+2 –

+1

@arms是的,這也是可能的,但他只需要創建一個自定義的'FileLocator'而不是'YamlFileLoader'。這個異常被引發到'Symfony \ Component \ Config \ FileLocator :: locate'中,所以我們只需要擴展基類來使得加載失敗。 – gilden

16

還有另一種選擇。

上的應用程序/ appKernel.php改變registerContainerConfiguration方法是:

public function registerContainerConfiguration(LoaderInterface $loader) 
{ 
    $loader->load(__DIR__.'/config/config_'.$this->getEnvironment().'.yml'); 

    $extrafiles = array (
     __DIR__.'/config/config_local.yml', 
    ); 

    foreach ($extrafiles as $filename) { 
     if (file_exists($filename) && is_readable($filename)) { 
      $loader->load($filename); 
     } 
    } 
} 

這種方式,您有覆蓋config_env.yml文件

+1

這是個好主意,謝謝 –

1

我嘗試上述兩種答案全球config_local.yml文件但沒有人爲我工作。

  1. 我犯了一個新的環境:「本地」是進口的「開發」,但你可以在這裏閱讀:There is no extension able to load the configuration for "web_profiler"你還必須破解AppKernel類。
    此外,您無法將config_local.yml設置爲.gitignore,因爲該文件在本地環境中是必需的。

  2. 因爲我有無論如何要破解AppKernel我試圖與$ extrafiles的方法,但是,導致「ForbiddenOverwriteException」

所以,現在什麼工作對我來說是$ extrafiles辦法的修改:
替換app/AppKernel中。PHP
$loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml');

if ($this->getEnvironment() == 'dev') { 
     $extrafiles = array(
      __DIR__ . '/config/config_local.yml', 
     ); 
     foreach ($extrafiles as $filename) { 
      if (file_exists($filename) && is_readable($filename)) { 
       $loader->load($filename); 
      } 
     } 
    } else { 
     $loader->load(__DIR__ . '/config/config_' . $this->getEnvironment() . '.yml'); 
    } 
22

我知道這是一個非常古老的問題,我認爲在認可的解決方案是更好,我想我會給它並沒有改變任何代碼

的利益而簡單的解決方案

可以使用ignore_errors選項,這將不顯示任何錯誤,如果該文件不存在

imports: 
    - { resource: config_local.yml, ignore_errors: true } 

警告,如果文件中出現語法錯誤,它也將被忽略,因此如果您有意外的結果,請檢查以確保文件中沒有語法錯誤或其他錯誤。

相關問題