majermi4/friendly-config

提供一个使用纯PHP对象定义Symfony配置的更友好方式。

v1.3.0 2022-10-26 15:10 UTC

README

提供一个使用纯PHP对象定义Symfony配置的更友好方式。

Latest Stable Version tests Coverage Status License: MIT

我们非常喜欢Symfony配置组件!💖它为我们提供了模式、验证、文档和更多功能,以便于我们扩展配置。然而,我们很多人都不喜欢定义它...本项目旨在改变这一现状。

文档

  1. 动机
    1. 代码重复
    2. 手动编写配置定义很困难
    3. 对开发和重构速度的负面影响
  2. 使用方法
    1. 基础
    2. 简单类型
    3. 嵌套类型
    4. 其他推断配置选项
      1. 必需
      2. 默认值
      3. 信息
  3. 限制

安装

可以通过Composermajermi4/friendly-config的方式安装。

composer require majermi4/friendly-config

基本用法

不需要编写如下配置

$rootNode
    ->children()
        ->arrayNode('connection')
            ->children()
                ->scalarNode('driver')
                    ->isRequired()
                    ->cannotBeEmpty()
                ->end()
                ->scalarNode('host')
                    ->defaultValue('localhost')
                ->end()
                ->scalarNode('username')->end()
                ->scalarNode('password')->end()
                ->booleanNode('memory')
                    ->defaultFalse()
                ->end()
            ->end()
        ->end()
        ->arrayNode('settings')
            ->addDefaultsIfNotSet()
            ->children()
                ->scalarNode('name')
                    ->isRequired()
                    ->cannotBeEmpty()
                    ->defaultValue('value')
                ->end()
            ->end()
        ->end()
    ->end()
;

只需编写如下纯PHP对象

class MyConfig
{
    public function __construct(Connection $connection, Settings $settings) { /* your code */ }
}

class Connection
{
    public function __construct(
        string $driver,
        string $username,
        string $password,
        string $host = 'localhost',
        bool $memory = false,
    ) { /* your code */ }
}

class Settings
{
    public function __construct(string $name = 'value') { /* your code */ }
}

以下几行代码将您的纯PHP对象转换为有效的Symfony配置,该配置定义了您的扩展配置的架构。除此之外,处理后的配置值用于初始化您的纯PHP对象,因此您可以轻松访问处理后的值。

您可以注册初始化的配置对象作为服务,这将允许您在应用程序的任何位置轻松访问初始化的配置对象。

use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
use Majermi4\FriendlyConfig\FriendlyConfiguration;
use Majermi4\FriendlyConfig\InitializeConfigObject;
use Majermi4\FriendlyConfig\RegisterConfigService;

class MyBundleExtension extends Extension
{
    /**
     * {@inheritdoc}
     */
    public function getConfiguration(array $config, ContainerBuilder $container) : ConfigurationInterface
    {
        return FriendlyConfiguration::fromClass(MyConfig::class, 'my_config');
    }
    
    /**
     * {@inheritdoc}
     */
    public function load(array $configs, ContainerBuilder $container): void
    {
        $configuration = $this->getConfiguration($configs, $container);
        $config = $this->processConfiguration($configuration, $configs);

        if ($configuration instanceof FriendlyConfiguration) {
            // Register config object with processed values as a service 
            RegisterConfigService::fromProcessedConfig($configuration->getConfigClass(), $config, $container);
    
            // Or ... initialise config object from processed config immediately if needed
            $initialisedConfig = InitializeConfigObject::fromProcessedConfig(MyConfig::class, $config);
        }        
    }
}