Как выставить семантическую конфигурацию - PullRequest
2 голосов
/ 22 марта 2012

В процессе создания стороннего комплекта для платформы Symfony2 я столкнулся с проблемой разрешения конфигурации в файле app / config.yml.Я хочу сделать это, чтобы пользователям комплекта (в основном, мне) не приходилось заходить в комплект для внесения изменений в конфигурацию.

Мой файл Configuration.php комплекта читает:

<?php

namespace Ms2474\AuthNetBundle\DependencyInjection;

use Symfony\Component\Config\Definition\Builder\NodeBuilder;
use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;

class Configuration implements ConfigurationInterface
{
    public function getConfigTreeBuilder() {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('authorize_net');
        $rootNode
            ->children()
                ->scalarNode('login_id')->defaultNull()->end()
                ->scalarNode('transaction_key')->defaultNull()->end()
                ->booleanNode('sandbox')->defaultValue(true)->end()
                ->scalarNode('log_file')->defaultValue(false)->end()
            ->end();

        return $treeBuilder;
    }
}

Файл расширения пакета (Ms2474AuthNetBundleExtension.php) читает:

<?php

namespace Ms2474\AuthNetBundle\DependencyInjection;

use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Definition\Processor;

class Ms2474AuthNetBundleExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $processor = new Processor();
        $configuration = new Configuration();
        $config = $processor->process($configuration->getConfigTree(), $configs);

        if (null === $config['sandbox']) {
            $config['sandbox'] = $container->getParameter('kernel.debug');
        }

        $container->setParameter('authorize_net.login_id', $config['login_id']);
        $container->setParameter('authorize_net.transaction_key', $config['transaction_key']);
        $container->setParameter('authorize_net.sandbox', $config['sandbox']);

        if (isset($config['log_file'])) {
            $container->setParameter('authorize_net.log_file', $config['log_file']);
        }

        $loader = new YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config'));
        $loader->load('services.yml');
    }
}

Теперь к проблеме: Когда я пытаюсь добавить следующее в файл app / config.yml:

authorize_net:
    login_id: 1234
    transaction_key: 1234
    sandbox: true
    log_file: false

я получаю следующие две ошибки:

InvalidArgumentException: There is no extension able to load the configuration for "authorize_net" (in /path/to/app/config/config.yml). Looked for namespace "authorize_net", found "framework", "security", "twig", "monolog", "swiftmailer", "assetic", "doctrine", "sensio_framework_extra", "jms_security_extra", "jms_aop", "fos_user", "jms_serializer", "fos_rest", "stof_doctrine_extensions", "vich_uploader", "gri_user", "gri_campaign", "gri_authorized_contact", "web_profiler", "sensio_distribution"

и:

FileLoaderLoadException: Cannot import resource "/path/to/app/config/config.yml" from "/path/to/app/config/config_dev.yml".

И вопрос: Что я здесь не так делаю?Я просмотрел документацию , а также сравнил свой код с другими пакетами, такими как FOSUserBundle .

1 Ответ

1 голос
/ 22 марта 2012

Во-первых, он должен называться Ms2474AuthNetExtension, а не Ms2474AuthNetBundleExtension.

Во-вторых, если вы не настроили пользовательское пространство имен для расширения и не загрузили его вручную, параметры конфигурации должны быть в разделе ms2474_auth_net, а не authorize_net.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...