Symfony2 - как расширить пакет поставщика (например, FOSFacebookBundle)

Сценарий:

Я использую пакет (FOSFacebookBundle), который позволяет мне устанавливать параметры только для одного приложения facebook в моей конфигурации. Все отлично работает, но теперь мне нужно установить не одно, а несколько приложений.

Мой подход:

Я создал AcmeFacebookBundle, который позволяет определять несколько приложений (конфигурация определена в Acme \ FacebookBundle \ DependencyInjection \ Configuration) в массиве так:

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]

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

Проблема:

Но это именно то, где я застрял. Очевидно, у меня нет доступа к объекту запроса или DiC из AcmeFacebookExtension, чтобы сделать это сравнение. Я совершенно не прав в своем подходе? У вас есть идея, как решить эту проблему?

1 ответ

Решение

То, что вы хотите создать, это CompilerPass так что вы можете манипулировать Container после того, как все остальные конфигурации загрузились. Это должно начать вас:

Другие вопросы по тегам