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)539.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 3d 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 82% of packages

Maintenance29

Infrequent updates — may be unmaintained

Popularity28

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

1294d 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)
```

###  Alternatives

[symplify/monorepo-builder

Not only Composer tools to build a Monorepo.

5205.3M82](/packages/symplify-monorepo-builder)[civicrm/civicrm-core

Open source constituent relationship management for non-profits, NGOs and advocacy organizations.

728272.9k20](/packages/civicrm-civicrm-core)[codefog/contao-haste

haste extension for Contao Open Source CMS

42650.8k139](/packages/codefog-contao-haste)[symfony/ai-bundle

Integration bundle for Symfony AI components

30282.3k6](/packages/symfony-ai-bundle)[spomky-labs/pwa-bundle

Progressive Web App Manifest Generator Bundle for Symfony.

6144.4k1](/packages/spomky-labs-pwa-bundle)[symfony/ux-cropperjs

Cropper.js integration for Symfony

19280.3k3](/packages/symfony-ux-cropperjs)

PHPackages © 2026

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