2014-07-10 20 views
7

我有一個Yaml加載程序,它爲「配置文件」(其中一個應用程序可以使用不同配置文件,例如用於同一站點的不同本地版本)加載其他配置項。Symfony 2 - 如何在我自己的Yaml文件加載器中解析%參數%?

我的加載程序是非常簡單的:

# YamlProfileLoader.php 

use Symfony\Component\Config\Loader\FileLoader; 
use Symfony\Component\Yaml\Yaml; 

class YamlProfileLoader extends FileLoader 
{ 
    public function load($resource, $type = null) 
    { 
     $configValues = Yaml::parse($resource); 
     return $configValues; 
    } 

    public function supports($resource, $type = null) 
    { 
     return is_string($resource) && 'yml' === pathinfo(
      $resource, 
      PATHINFO_EXTENSION 
     ); 
    } 
} 

裝載機是用來或多或少像這樣(簡化了一下,因爲有太多緩存):

$loaderResolver = new LoaderResolver(array(new YamlProfileLoader($locator))); 
$delegatingLoader = new DelegatingLoader($loaderResolver); 

foreach ($yamlProfileFiles as $yamlProfileFile) { 
    $profileName = basename($yamlProfileFile, '.yml'); 
    $profiles[$profileName] = $delegatingLoader->load($yamlProfileFile); 
} 

原來是YAML文件它的解析:

# profiles/germany.yml 

locale: de_DE 
hostname: %profiles.germany.host_name% 

目前,由此產生的數組字面上包含'%profiles.germany.host_name%''hostname'數組密鑰。

那麼,我如何解析%參數來獲取實際參數值?

我一直在通過Symfony 2代碼和文檔(和this SO question)進行拖拽,並且無法找到在框架本身內部完成的任務,我可能編寫自己的參數解析器 - 從內核獲取參數,搜索爲%foo%字符串和查找/替換...但如果有一個組件準備好使用,我更喜歡使用這個。

爲了給出更多的背景,爲什麼我不能只包含它到主要config.yml中:我想能夠加載app/config/profiles/*.yml,其中*是配置文件名稱,我使用自己的Loader來完成此操作。如果有通配符導入配置文件的方法,那麼也可能適用於我。

注意:目前使用2.4,但如果有幫助,可以升級到2.5。

回答

0

我嘗試了很多選項來將%parameter%解析爲parameters.yml,但根本沒有運氣。我能想到的只是解析%參數%並從容器中取出它,而現在還沒有創新。

另一方面,我沒有足夠的有關您的環境的信息來查看大圖,但我只是想出了另一個想法。如果您在您的parameters.yml文件中聲明您的配置文件並將其作爲數組加載到控制器或服務中,則可以非常方便地通過容器。

應用程序/配置/ parameters.yml

parameters: 
    profiles: 
     germany: 
      locale: de_DE 
      host_name: http://de.example.com 
     uk: 
      locale: en_EN 
      host_name: http://uk.example.com 
     turkey: 
      locale: tr_TR 
      host_name: http://tr.example.com 

你可以有你的個人資料,如您的控制器的陣列。

<?php 

namespace Acme\DemoBundle\Controller; 

use Symfony\Bundle\FrameworkBundle\Controller\Controller; 

class DefaultController extends Controller 
{ 
    public function indexAction() 
    { 


     $profiles = $this->container->getParameter('profiles'); 
     var_dump($profiles); 

     return $this->render('AcmeDemoBundle:Default:index.html.twig'); 
    } 
} 

採用這種方法

  • 你不必編寫自定義YamlLoader
  • 您不必擔心輸入參數到其他陽明文件就
  • 你可以有你配置文件作爲數組在任何時候您手中都有$容器
  • 您不必一個一個地加載/緩存配置文件
  • 你不必找到通配符文件加載解決方案

如果我正確地得到了你的問題,這種方法可以幫助你。

1

我一直拖網通過的Symfony 2的代碼和文檔(這SO問題,找不到在哪裏,這是框架本身內完成。

的Symfony的依賴注入組件使用的編譯器通過在優化階段,以解決參數引用。

Compiler獲得註冊的編譯器從PassConfig例如通過。該類配置a few compiler passes by default,其中包括ResolveParameterPlaceHoldersPass

在容器編譯期間,ResolveParameterPlaceHoldersPass使用容器的ParameterBagresolve strings,其中包含%parameters%。編譯器通過然後將解析的值設置回容器。

那麼,我該如何解析%參數來獲取實際的參數值呢?

您需要訪問ProfileLoader中的容器(或任何您認爲合適的地方)的容器。使用容器,您可以遞歸地遍歷解析的yaml配置並將值傳遞給容器的參數包,通過resolveValue()方法解決。


我看來,像或許更簡潔的方法將是你實現這個組合中的配置。這樣你的配置就會根據定義的結構進行驗證,這可以在早期捕獲配置錯誤。有關更多信息,請參閱bundle configuration上的文檔(該鏈接適用於v2.7,但希望也適用於您的版本)。

我意識到這是一個古老的問題,但我花了很長一段時間爲我自己的項目弄清楚這一點,所以我在這裏發佈答案供將來參考。

相關問題