Symfony2 - 如何扩展供应商包(例如FOSFacebookBundle)

Bur*_*rgi 5 facebook symfony 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]
Run Code Online (Sandbox Code Playgroud)

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]);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

问题:

但这正是我被困的地方.显然,我无法从AcmeFacebookExtension中访问Request对象或DiC来进行此比较.我的做法是否完全错了?你对如何解决这个问题有任何更好的想法吗?

lee*_*eek 4

您想要创建的是 ,CompilerPass以便您可以Container在加载所有其他配置后操作 。这些应该可以帮助您开始:

  • 嗯...也许您必须实现一个“EventListener”(而不是一个“CompilerPass”)。如果所有其他方法都失败,您可以忽略尝试更改 Symfony 配置参数并修改实例本身,例如;`$container->get('fos_facebook.api')->setAppId('foo')` (2认同)