Symfony2 - So erweitern Sie ein Herstellerpaket (z.von FOSFacebookBundle)
-
12-12-2019 - |
Frage
Szenario:
Ich verwende ein Bundle (FOSFacebookBundle), mit dem ich Parameter für genau eine Facebook-App in meiner Konfiguration festlegen kann.Alles funktioniert einwandfrei, aber jetzt muss ich nicht nur eine App einstellen, sondern mehrere.
Mein Ansatz:
Ich habe ein AcmeFacebookBundle erstellt, mit dem mehrere Apps definiert werden können (Konfiguration definiert in Acme \ FacebookBundle \ Abhängigkeiteinspritzung \ Konfiguration) in einem Array wie folgt:
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 \ Abhängigkeitsinjektion \ ACMEFACEBOOKERWEITERUNG Ich durchlaufe dann alle Apps.Die Idee ist, den Parameter server_url mit der aktuellen URL zu vergleichen und die Konfiguration fos_facebook mit meiner zu überschreiben.
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:
Aber genau hier stecke ich fest.Offensichtlich habe ich innerhalb von AcmeFacebookExtension keinen Zugriff auf das Anforderungsobjekt oder das DiC, um diesen Vergleich durchzuführen.Gehe ich in meinem Ansatz völlig falsch?Haben Sie eine bessere Idee, wie Sie dieses Problem angehen können?
Lösung
Was Sie erstellen möchten, ist ein CompilerPass
damit Sie die manipulieren können Container
nachdem alle anderen Konfigurationen geladen wurden.Diese sollten Ihnen den Einstieg erleichtern: