Конфигурации Symfony в комплекте по умолчанию - PullRequest
0 голосов
/ 03 октября 2018

Я искал ответ, но не нашел ничего полезного ..

Я спросил на Symfony Github, но они сказали мне написать здесь .. https://github.com/symfony/symfony/issues/28650

Я пишупростой пакет Symfony, но у меня проблема с изменением настроек по умолчанию.Я имею в виду, что я хочу использовать переводы yaml (не xliff), сопоставления доктрин yaml (не аннотации), проверку yaml (не аннотации) и т. Д. (Я знаю, что yaml в доктрине устарела)

Есть лиВозможность изменить эту конфигурацию внутри пакета?Я хочу, чтобы мои пакеты были настроены самостоятельно, я не хочу настраивать доктрину, переводы и т. Д. Внутри моего основного приложения.

Спасибо за помощь

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете определить конфигурацию по умолчанию в Symfony через Классы расширений , также посмотрите это Руководство по настройке Symfony Bundle , оно многое объясняет о конфигурации пакета.Конфигурации по умолчанию могут быть для доктрины, переводов или чего-либо еще, что вы можете настроить на уровне приложения.Даже изменение конфигурации других комплектов возможно с Prepend Extension

Компонент Config отвечает за управление этими правилами конфигурации, вы можете узнать больше о Компонент Config и Определениеи Обработка значений конфигурации страниц в документации.

FOSOAuthServerBundle является примером конфигурации Doctrine по умолчанию.
Они предпочитают XML, но это решение о формате, логика конфигурации одинакова для XML, YAML или PHP.

msgphp / user-bundle Конфигурация является другим примером конфигурации с помощью файлов PHP.

Давайте поговорим в коде, это пример конфигурации YAML с сущностью doctrine ипростой конфигурационный массив.Во-первых, создать класс конфигурации предоставляет правила конфигурации по умолчанию для нашего комплекта.

// src/Acme/HelloBundle/DependencyInjection/Configuration.php
namespace Acme\HelloBundle\DependencyInjection;

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('acme_hello');

        $rootNode
            ->children()
                ->arrayNode('simple_array')
                    ->children()
                        ->scalarNode('foo')->end()
                        ->scalarNode('bar')->end()
                    ->end()
                ->end()
                ->arrayNode('doctrine')
                    ->children()
                        ->arrayNode('entity')
                            ->children()
                                ->scalarNode('class')->isRequired()->cannotBeEmpty()->end()
                            ->end()
                        ->end()
                        ->arrayNode('manager')
                            ->children()
                                ->scalarNode('class')->defaultValue('Acme\\HelloBundle\\Entity\\Manager\\EntryManager')->end()
                            ->end()
                        ->end()
                     ->end()
                 ->end()
            ->end()
        ;

        return $treeBuilder;
    }
}

Во-вторых, подготовьте класс расширения нашего пакета для загрузки этих конфигураций.

//src/Acme/HelloBundle/DependencyInjection/AcmeHelloExtension.php
namespace Acme\HelloBundle\DependencyInjection;

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

class AcmeHelloExtension extends Extension
{
    public function load(array $configs, ContainerBuilder $container)
    {
        $configuration = new Configuration();
        $config = $this->processConfiguration($configuration, $configs);

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

        // you now have these 2 config keys
        // $config['simple_array'] and $config['doctrine']
        // $container->getDefinition('acme_hello.simple_array.foo');
    }
}

Наконец, создайте определения YAML по умолчанию и зарегистрируйте наш менеджер ввода в контейнере.

//src/Acme/HelloBundle/Resources/config/acme_hello.yaml
acme_hello:
    simple_array:
        foo: 'hello'
        bar: 'world'
    doctrine:
        entity:
            class: 'Acme\HelloBundle\Entity\Entry'
        manager:
            class: 'Acme\HelloBundle\Entity\Manager\EntryManager'

//src/Acme/HelloBundle/Resources/config/services.yaml
services:
    acme_hello.entry_manager:
        class:     '%acme_hello.doctrine.manager.class%'
        arguments: [ '@doctrine.orm.entity_manager', '%acme_hello.doctrine.entity.class%' ]

Также мы можем переопределить конфигурацию по умолчанию на уровне приложения.

//config/packages/acme_hello.yaml
acme_hello:
    simple_array:
        foo: 'world'
        bar: 'hello'
...