Symfony2 – как расширить пакет поставщика (например.из FOSFacebookBundle)
-
12-12-2019 - |
Вопрос
Сценарий:
Я использую пакет (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]);
}
}
}
Проблема:
Но именно здесь я и застрял.Очевидно, у меня нет доступа к объекту Request или DiC из AcmeFacebookExtension, чтобы выполнить это сравнение.Я совершенно ошибаюсь в своем подходе?Есть ли у вас идеи получше, как решить эту проблему?
Решение
То, что вы хотите создать, — это CompilerPass
чтобы вы могли манипулировать Container
после загрузки всей остальной конфигурации.Это должно помочь вам начать: