2012-03-12 10 views
5

Scenario:Symfony2 - come estendere un fascio fornitore (ad esempio del FOSFacebookBundle)

sto usando un fascio (FOSFacebookBundle) che mi permette di impostare i parametri per esattamente un'applicazione Facebook nella mia configurazione. Tutto funziona perfettamente bene, ma ora ho bisogno di impostare non solo una app, ma più.

Il mio approccio:

ho creato un AcmeFacebookBundle, che consente a più applicazioni da definire (configurazione definita in Acme \ FacebookBundle \ DependencyInjection \ Configuration) in un array in questo modo:

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 Mi collego quindi a tutte le app. L'idea è di confrontare il parametro server_url con l'URL corrente e sovrascrivere la configurazione di fos_facebook con la mia.

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

Problema:

Ma questo è esattamente dove mi sono bloccato. Ovviamente, non ho accesso all'oggetto Request o al DiC da AcmeFacebookExtension per fare questo confronto. Sto sbagliando completamente nel mio approccio? Hai qualche idea migliore su come affrontare questo problema?

+0

Diverso questin, stesso obiettivo: [carico configurazione condizionale Symfony2] (http://stackoverflow.com/questions/9603384/symfony2-load-condizionale-configurazione) – leek

+0

Sì, non sono sicuro se l'impostazione di configurazione nel controller è l'approccio giusto però? Iniezione di config quando l'analisi di configurazione avviene sembra il modo giusto per farlo ... – Burgi

risposta

4

Quello che si desidera creare è un CompilerPass in modo da poter manipolare lo Container dopo aver caricato tutte le altre configurazioni. Questi dovrebbero iniziare:

+0

Top roba, esattamente quello di cui avevo bisogno. Lo prendo da lì. L'unico problema che riesco a vedere è che FOSUserbundle richiede ancora che tutta la configurazione di fos_user venga impostata al momento dell'analisi iniziale, quindi ora devo mettere a punto alcune configurazioni fittizie. Riesci a vedere in qualche modo intorno a questo? – Burgi

+0

Hai provato a caricare prima il tuo pacchetto? In questo modo è possibile impostare i parametri richiesti prima che gli altri bundle ne abbiano bisogno. (Non sono del tutto sicuro che funzionerà - solo un'ipotesi) – leek

+0

Sì, ho giocato con l'ordine dei pacchetti. I metodi Extension-> load() sembrano essere chiamati per primi, e i metodi CompilerPass solo una volta che tutte le configurazioni di estensione sono state elaborate. Inoltre, poiché non riesco ancora ad accedere all'intero contenitore in CompilerPass, non riesco a ottenere l'oggetto Request e devo ricorrere a $ _SERVER per ottenere l'URL corrente :( – Burgi

Problemi correlati