PHPackages                             majermi4/friendly-config - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. majermi4/friendly-config

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

majermi4/friendly-config
========================

Provides a friendlier way to define Symfony configuration using plain old PHP objects.

v1.3.0(3y ago)639.9k2MITPHPPHP ^7.4|^8.0

Since Mar 17Pushed 1y ago1 watchersCompare

[ Source](https://github.com/majermi4/FriendlyConfig)[ Packagist](https://packagist.org/packages/majermi4/friendly-config)[ RSS](/packages/majermi4-friendly-config/feed)WikiDiscussions main Synced 3w ago

READMEChangelog (9)Dependencies (7)Versions (12)Used By (0)

🌱 Friendly Config *(Easy way to write Symfony Configuration)*
=============================================================

[](#seedling-friendly-config-easy-way-to-write-symfony-configuration)

> Provides a friendlier way to define [Symfony configuration](https://symfony.com/doc/current/components/config/definition.html) using plain old PHP objects.

[![Latest Stable Version](https://camo.githubusercontent.com/61520db7a379d37375286848d6bb020f3ce49c8860f24e0ac50386437182444e/68747470733a2f2f706f7365722e707567782e6f72672f6d616a65726d69342f667269656e646c792d636f6e6669672f76)](//packagist.org/packages/majermi4/friendly-config)[![tests](https://github.com/majermi4/FriendlyConfig/actions/workflows/php.yml/badge.svg)](https://github.com/majermi4/FriendlyConfig/actions/workflows/php.yml/badge.svg)[![Coverage Status](https://camo.githubusercontent.com/a82c711cbaf5e98014eabfaadef29c1f83982741f049f926e8313d583b8a77ed/68747470733a2f2f636f766572616c6c732e696f2f7265706f732f6769746875622f6d616a65726d69342f467269656e646c79436f6e6669672f62616467652e7376673f6272616e63683d6d61696e)](https://coveralls.io/github/majermi4/FriendlyConfig?branch=main)[![License: MIT](https://camo.githubusercontent.com/08cef40a9105b6526ca22088bc514fbfdbc9aac1ddbf8d4e6c750e3a88a44dca/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d626c75652e737667)](https://github.com/majermi4/FriendlyConfig/blob/main/LICENSE)

We love the Symfony configuration component! ❤️ It provides schema, validation, documentation and many more features to our bundle configs. However, many of us don't like defining it ... The goal of this project is to change that.

Documentation
-------------

[](#documentation)

1. [Motivation](./docs/motivation.md)
    1. [Code duplication](./docs/motivation.md#code-duplication)
    2. [Writing config definition manually is hard](./docs/motivation.md#writing-config-definition-manually-is-hard)
    3. [Negative impact on development and refactoring speed](./docs/motivation.md#negative-impact-on-development-and-refactoring-speed)
2. [Usage](./docs/usage.md)
    1. [Basics](./docs/usage.md#basics)
    2. [Simple types](./docs/usage.md#simple-types)
    3. [Nested types](./docs/usage.md#nested-types)
    4. [Other inferred configuration options](./docs/usage.md#other-inferred-configuration-options)
        1. [Required](./docs/usage.md#required)
        2. [Default value](./docs/usage.md#default-value)
        3. [Info](./docs/usage.md#info)
3. [Limitations](./docs/limitations.md)

Installation
------------

[](#installation)

This is installable via [Composer](https://getcomposer.org/) as [majermi4/friendly-config](https://packagist.org/packages/majermi4/friendly-config):

```
composer require majermi4/friendly-config

```

Basic usage:
------------

[](#basic-usage)

Instead of having to write configuration such as this:

```
$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()
;
```

Write plain old PHP objects such as:

```
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 */ }
}
```

The following few lines will convert your pure PHP objects into valid Symfony configuration that defines schema of your bundle configuration. On top of that, the processed configuration values are used to initialize your pure PHP objects, so you can easily access the processed values.

You can register the initialised config objects as services which will allow you to easily access the initialised config objects anywhere in your application.

```
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);
        }
    }
}
```

###  Health Score

36

—

LowBetter than 79% of packages

Maintenance28

Infrequent updates — may be unmaintained

Popularity29

Limited adoption so far

Community9

Small or concentrated contributor base

Maturity64

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~73 days

Recently: every ~128 days

Total

9

Last Release

1347d ago

Major Versions

v0.2-beta → v1.0.02021-04-25

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/2118173?v=4)[Michal Majer](/maintainers/majermi4)[@majermi4](https://github.com/majermi4)

---

Top Contributors

[![majermi4](https://avatars.githubusercontent.com/u/2118173?v=4)](https://github.com/majermi4 "majermi4 (85 commits)")

###  Code Quality

TestsPHPUnit

Static AnalysisPHPStan

Code StylePHP CS Fixer

Type Coverage Yes

### Embed Badge

![Health badge](/badges/majermi4-friendly-config/health.svg)

```
[![Health](https://phpackages.com/badges/majermi4-friendly-config/health.svg)](https://phpackages.com/packages/majermi4-friendly-config)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
