2012-03-12 18 views
5

Scenariusz:Symfony2 - jak rozszerzyć pakiet dostawcy (na przykład z FOSFacebookBundle)

używam pakiet (FOSFacebookBundle), który pozwala mi ustawić parametry do dokładnie jednej aplikacji Facebook w mojej konfiguracji. Wszystko działa idealnie, ale teraz muszę ustawić nie tylko jedną aplikację, ale i wiele.

Moje podejście:

Utworzyłem AcmeFacebookBundle, który umożliwia wiele aplikacji, które zostaną określone (konfiguracja zdefiniowana w Acme \ FacebookBundle \ wstrzykiwanie zależności \ Configuration) w tablicy tak:

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] 

W Acme \ FacebookBundle \ DependencyInjection \ AcmeFacebookExtension Później przepuszczam wszystkie aplikacje. Chodzi o to, aby porównać parametr server_url z bieżącym adresem URL i nadpisać konfigurację fos_facebook przy pomocy mojego.

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]); 
      } 
     } 
    } 

Problem:

Ale to jest dokładnie tam, gdzie utknąłem. Oczywiście, nie mam dostępu do obiektu Request lub DiC z poziomu AcmeFacebookExtension, aby wykonać to porównanie. Czy podchodzę całkowicie niewłaściwie? Czy masz lepszy pomysł na rozwiązanie tego problemu?

+0

Different questin, sam cel: [Symfony2 obciążenie konfiguracja warunkowego] (http://stackoverflow.com/questions/9603384/symfony2-load-conditional-configuration) – leek

+0

Tak, nie jestem pewien, czy ustawienie konfiguracji w twoim kontrolerze jest jednak właściwym podejściem? Konfigurowanie wtrysku, gdy parsowanie konfiguracji odbywa się w odpowiedni sposób ... – Burgi

Odpowiedz

4

To, co chcesz utworzyć, to CompilerPass, dzięki czemu możesz manipulować Container po załadowaniu całej innej konfiguracji. Powinno Ci zacząć:

+0

Najlepsze rzeczy, dokładnie to, czego potrzebowałem. Wezmę to stamtąd. Jedyny problem, jaki widzę, to to, że FOSUserbundle nadal wymaga ustawienia wszystkich konfiguracji fos_user podczas początkowego parsowania, więc teraz muszę wykpić jakąś fałszywą konfigurację. Czy widzisz to w jakiś sposób? – Burgi

+0

Czy próbowałeś najpierw załadować swój pakiet? W ten sposób możesz ustawić wymagane parametry, zanim inne pakiety ich potrzebują. (Nie jestem całkiem pewien, że to zadziała - tylko zgaduję). – leek

+0

Tak, grałem z kolejnością pakietów. Wydaje się, że metody Extension-> load() są wywoływane jako pierwsze, a metody CompilerPass dopiero po przetworzeniu wszystkich konfiguracji rozszerzeń. Ponadto, ponieważ nadal nie mogę uzyskać dostępu do całego kontenera w CompilerPass, również nie mogę pobrać obiektu Request i muszę odwołać się do $ _SERVER, aby uzyskać bieżący adres URL :( – Burgi

Powiązane problemy