2012-03-12 50 views
5

場景:Symfony2的 - 如何擴大供應商的套裝(如的FOSFacebookBundle)

我使用的是包(FOSFacebookBundle),讓我設置參數在我的配置只有一個Facebook應用程序。一切正常,但現在我需要設置不僅一個應用程序,但多個。

我的方法:

我已經創建了一個AcmeFacebookBundle,其允許定義(在的Acme \ FacebookBundle \ DependencyInjection \配置定義的配置)在陣列中,像這樣的多個應用:

acme_facebook: 
    apps: 
     some_competition: 
      server_url: %acme.facebook.some_competition.server_url% 
      file: %kernel.root_dir%/../vendor/facebook/php-sdk/src/base_facebook.php 
      alias: facebook 
      app_id: %acme.facebook.some_competition.app_id% 
      secret: % acme .facebook.some_competition.secret% 
      cookie: true 
      permissions: [email, user_birthday, user_location] 
     some_other_competition: 
      server_url: %acme.facebook. some_other_competition.server_url% 
      file: %kernel.root_dir%/../vendor/facebook/php-sdk/src/base_facebook.php 
      alias: facebook 
      app_id: %acme.facebook. some_other_competition.app_id% 
      secret: % acme .facebook. some_other_competition.secret% 
      cookie: true 
      permissions: [email, user_birthday, user_location] 

In Acme \ FacebookBundle \ DependencyInjection \ AcmeFacebookExtension然後我循環遍歷所有應用程序。這個想法是將server_url參數與當前URL進行比較,並用我的配置覆蓋fos_facebook配置。

class AcmeFacebookExtension extends Extension 
{ 
    ... 
    /** 
    * {@inheritDoc} 
    */ 
    public function load(array $configs, ContainerBuilder $container) 
    { 
     $configuration = new Configuration(); 
     $config = $this->processConfiguration($configuration, $configs); 

     foreach ($config['apps'] as $app) 
     { 
      // check for matching path here? 
      foreach (array('file', 'app_id', 'secret', 'cookie', 'domain', 'logging', 'culture', 'permissions') as $attribute) 
      { 
       $container->setParameter('fos_facebook.' . $attribute, $app[$attribute]); 
      } 
     } 
    } 

問題:

但是,這也正是我堅持。很明顯,我無法訪問AcmeFacebookExtension中的Request對象或DiC來進行此比較。 我的方法完全錯了嗎?你對如何解決這個問題有更好的想法嗎?

+0

不同questin,同一個目標:Symfony2的負載條件設置](http://stackoverflow.com/questions/9603384/symfony2-load-conditional-configuration) – leek 2012-03-13 14:02:47

+0

是的,我不確定在控制器中設置配置是否正確?當配置解析發生時注入配置感覺就像正確的方式去做... – Burgi 2012-03-13 23:11:20

回答

4

你想創建的是CompilerPass,這樣你可以在所有其他配置加載後操作Container。這些應該讓你開始:

+0

頂級的東西,正是我所需要的。我會從那裏拿走它。我能看到的唯一問題是FOSUserbundle仍然要求在初始解析時設置所有fos_user配置,所以現在我必須模擬一些虛擬配置。你能看到任何解決方法嗎? – Burgi 2012-03-13 11:21:47

+0

你有沒有試過先加載你的包?這樣,您可以在其他捆綁包需要它們之前設置所需的參數。 (我不完全確定這會起作用 - 只是一個猜測) – leek 2012-03-13 12:34:00

+0

是的,我玩過捆綁的順序。 Extension-> load()方法似乎首先被調用,而CompilerPass方法只有在處理了所有擴展配置後纔會被調用。因爲我仍然無法訪問CompilerPass中的整個容器,所以我也無法獲取Request對象,並且不得不求助於$ _SERVER以獲得當前URL :( – Burgi 2012-03-13 13:01:18