场景:
我正在使用一个捆绑包(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]);
}
}
}
问题:
但这正是我陷入困境的地方。显然,我无法从AcmeFacebookExtension中访问Request对象或DiC来进行此比较。我的做法完全错了吗?你对如何解决这个问题有什么更好的主意吗?
您想要创建的是一个CompilerPass
,这样您就可以在加载所有其他配置后操作Container
。这些应该让你开始:
- Symfony2:服务容器编译器通过
- Symfony2:操作服务参数和定义
- 创建
CompilerPass