Symfony: Как загрузить пользовательский комплект конфигурации из файла? - PullRequest
2 голосов
/ 12 июня 2019

Я использую Symfony 3.4.Как я могу добавить пользовательский файл конфигурации в пользовательский пакет, который должен содержать список имен и регулярных выражений?Например:

// Config file content = list of names and regular expressions
NameA
NameB
Name[cC]+
Some\w+Other(Name|Pattern)
...


// Symfony controller
$patterns = $this->getPatternConfigFromFileSomehow(...);

В документации Symfony я нашел информацию о добавлении пользовательской конфигурации в файлы .yml в каталогах app/config или MyBundle/Resources/config.Однако речь идет не о небольшом наборе четко определенных параметров (например, mailaddress: xyz), а о списке любого количества записей.

Кроме того, конфигурацию следует загружать, только если она действительно используется, а не каждый раз, когда ядроили сервисы созданы.

Конечно, я мог бы просто использовать file_get_contents или любой аналогичный метод PHP для загрузки любого файла, однако это выглядит довольно хакерским, а не "способом Symfony" ...

Итак, каков "правильный" способ сделать это?

РЕДАКТИРОВАТЬ:

ymlФайлы отлично подходят для настройки параметров , но это не о параметрах (= ключ + значение), а список имен файлов и регулярных выражений.Этот список не имеет определенную длину, а записи не имеют определенные имена.Таким образом, .yml не является правильным решением здесь, не так ли?

Кроме того, файлы конфигурации, которые добавляются с помощью ConfigTreeBuilder, загружаются при загрузке ядра, не так ли?Я ищу ленивое решение, которое загружает список только при необходимости.

1 Ответ

3 голосов
/ 12 июня 2019

Поместите свой файл yml в любой каталог конфигурации (app / config, config, Resources / config), который загружен.Как вы называете файл, не имеет значения.Важно то, что ваш корневой узел в этом yml является корневым узлом, который вы определяете в / your-bundle / src / DependencyInjection / Configuration.php

, если вы определили его следующим образом:

public function getConfigTreeBuilder()
{
    $treeBuilder = new TreeBuilder('your_root_node' );
    $treeBuilder->getRootNode()... 

    // with use of array prototypes... 

    $treeBuilder = new TreeBuilder('your_root_node');
    $rootNode = $treeBuilder->getRootNode();

    $rootNode
        ->children()
            ->arrayNode('fields')
                ->arrayPrototype()
                    ->children()
                        ->enumNode('type')
                            ->values(['iris','iri','entity','entities','datetime','string','integer','boolean','custom_class'])
                            ->defaultNull()
                        ->end()
                        ->enumNode('type_out')
                            ->values(['iris','iri','entity','entities','datetime','string','integer','boolean','custom_class'])
                            ->defaultNull()
                        ->end()
                        ->scalarNode('entity')->defaultNull()->end()
                        ->scalarNode('customClass')->defaultNull()->end()
                        ->arrayNode('parameters')
                            ->useAttributeAsKey('name')
                            ->scalarPrototype()->end()
                        ->end()
                        ->booleanNode('nullable')->defaultFalse()->end()
                    ->end()
                ->end()
            ->end()
        ->end()
    ;

    ...
}

Тогда у вас должен быть файл yml, начинающийся следующим образом:

your_root_node:
    my_parameter:
    my_other_parameter:
        and_so_on:

Кроме того, файл конфигурации с определением не должен загружаться с ядром и может быть загружен 'лениво' втакой сервис:

    use Symfony\Component\Config\Definition\Builder\TreeBuilder;
use Symfony\Component\Config\Definition\ConfigurationInterface;
use Symfony\Component\Config\Definition\Processor;
class SchemaConfiguration implements ConfigurationInterface
{
    /**
     * {@inheritdoc}
     */
    public function getConfigTreeBuilder()
    {
        $treeBuilder = new TreeBuilder();
        $rootNode = $treeBuilder->root('schema');
        $rootNode
            ... // Tree definition
            ->end()
        ;
        return $treeBuilder;
    }
    /**
     * @param $schemaConfig
     * @return mixed
     */
    public function getSchemaFromYaml($schemaConfig){
        $configuration = new SchemaConfiguration();
        $processor = new Processor();
        $processed = $processor->processConfiguration($configuration, $schemaConfig);
        $schema = $processed['fields'];
        return $schema ;
    }


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