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

2024-03-27

设想:

我正在使用一个捆绑包(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]

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

Problem:

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


你想要创建的是一个CompilerPass这样你就可以操纵Container加载所有其他配置后。这些应该可以帮助您开始:

  • Symfony2:服务容器编译器通行证 http://miller.limethinking.co.uk/2012/02/15/symfony2-service-container-compiler-passes/
  • Symfony2:操作服务参数和定义 http://miller.limethinking.co.uk/2012/02/22/symfony2-manipulating-service-parameters-and-definitions/
  • 创建一个CompilerPass http://symfony.com/doc/current/cookbook/service_container/tags.html#create-a-compilerpass
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Symfony2 - 如何扩展供应商包(例如 FOSFacebookBundle) 的相关文章

随机推荐