majermi4 / friendly-config
提供一个使用纯PHP对象定义Symfony配置的更友好方式。
v1.3.0
2022-10-26 15:10 UTC
Requires
- php: ^7.4|^8.0
- nette/utils: ^3.2
- phpstan/phpdoc-parser: ^1.2.0
- symfony/config: ^5.0|^6.0
- symfony/dependency-injection: ^5.0|^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^v2.19.3
- phpstan/phpstan: ^1.4.6
- phpunit/phpunit: ^9.5.16
This package is auto-updated.
Last update: 2024-09-16 12:49:56 UTC
README
提供一个使用纯PHP对象定义Symfony配置的更友好方式。
我们非常喜欢Symfony配置组件!💖它为我们提供了模式、验证、文档和更多功能,以便于我们扩展配置。然而,我们很多人都不喜欢定义它...本项目旨在改变这一现状。
文档
安装
可以通过Composer以majermi4/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); } } }