Symfony捆绑包默认配置

时间:2018-10-02 21:07:52

标签: php symfony composer-php bundle config

我一直在寻找答案,但是我没有找到任何帮助。

我在symfony github上问,但他们叫我在这里写。.https://github.com/symfony/symfony/issues/28650

我正在编写一个简单的symfony捆绑包,但是在更改默认配置时遇到问题。我的意思是我想使用yaml翻译(不是xliff),yaml学说映射(不是注释),yaml验证(不是注释)等(我知道不赞成使用yaml教义)

是否有可能在捆绑包中更改此配置? 我希望我的捆绑包是自配置的,我不想在主应用程序中配置教义,翻译等。

感谢帮助

1 个答案:

答案 0 :(得分:1)

您可以通过Extension Classes在Symfony中定义默认配置,也请参阅本Symfony Bundle Configuration指南,其中介绍了很多有关捆绑软件配置的信息。默认配置可以是教义,翻译或您可以在应用程序级别配置的任何其他配置。使用Prepend Extension

甚至可以修改其他分发包配置。

Config组件负责管理此配置规则,您可以从文档的Config ComponentDefining and Processing Configuration Values页中了解更多信息。

FOSOAuthServerBundle是Doctrine默认配置的示例。
他们更喜欢XML,但这是一种格式决定,XML,YAML或PHP的配置逻辑相同。

msgphp/user-bundle配置是通过PHP文件配置的另一个示例。

让我们用代码讲话,这是带有理论实体和简单配置数组的YAML配置示例。 首先,create Configuration类为我们的捆绑包提供了默认的配置规则。

// 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'