adrenalinkin / config-helper
Extends Symfony Dependency Injection Component and provides store configurations in each bundles separately by common yaml-file
Requires
- php: ~5.4||~7.0
- symfony/config: ~2.5||~3.0||~4.0
- symfony/dependency-injection: ~2.5||~3.0||~4.0
- symfony/finder: ~2.5||~3.0||~4.0
- symfony/yaml: ~2.3.42||~2.7.14||~2.8.7||~3.0||~4.0
Suggests
- symfony/symfony: Allows more advanced functionality with full Symfony package
README
Introduction
Component allows extend standard class Symfony\Component\DependencyInjection\Extension\Extension
and open possibility
for collect YAML
configurations across all registered bundles.
Installation
Open a command console, enter your project directory and execute the following command to download the latest stable version of this component:
composer require adrenalinkin/config-helper
This command requires you to have Composer install globally.
Usage examples and compare with standard methods
Let's say we have two bundles in our project. Bundles contains business-logic of the two separate system parts:
AcmeBundle
with entitiesAcmeBundle:User
andAcmeBundle:Position
AcmePostBundle
with entityAcmePostBundle:Post
Imagine you need to add configuration for each entity. Let's say we need configuration which should determine
user's system role for get access to specific functionality. For the configuration creation has been created bundle
AcmeConfigBundle
. Configuration example:
acme_config: AcmeBundle:User: ROLE_USER_ADMIN # key - name of the entity; value - role AcmeBundle:Position: ROLE_USER_ADMIN AcmePostBundle:Post: ROLE_POST_ADMIN
Standard methods
We can put configuration into global configuration file app/config/config.yml
:
# app/config/config.yml # other bundle's configurations acme_config: AcmeBundle:User: ROLE_USER_ADMIN AcmeBundle:Position: ROLE_USER_ADMIN AcmePostBundle:Post: ROLE_POST_ADMIN # other bundle's configurations
Also, we can put configuration into AcmeConfigBundle
bundle under specific configuration file and load that from
AcmeConfigExtension
:
#Acme/ConfigBundle/Resources/config/custom.yml acme_config: AcmeBundle:User: ROLE_USER_ADMIN AcmeBundle:Position: ROLE_USER_ADMIN AcmePostBundle:Post: ROLE_POST_ADMIN
However, both of method, for our realisation, got one flaw. All time when we will create new bundles - we will need
modify global configuration file or configuration file in the AcmeConfigBundle
.
Both situation provoke a hard-linking between separate parts of the project
Component usage
To prevent hard-linkin between separate parts of the project you need:
- Choose file name for configuration store, for example
acme_config.yml
. - Extends
AcmeConfigExtension
from AbstractExtension:
<?php namespace Acme\Bundle\ConfigBundle\DependencyInjection; use Linkin\Component\ConfigHelper\Extension\AbstractExtension; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Loader; class AcmeConfigExtension extends AbstractExtension { /** * {@inheritdoc} */ public function getAlias() { return 'acme_config'; } /** * {@inheritdoc} */ public function load(array $configs, ContainerBuilder $container) { // load all configurations from the all registered bundles $configs = $this->getConfigurationsFromFile('acme_config.yml', $container); // process received configuration $configs = $this->processConfiguration(new Configuration(), $configs); // some actions $loader = new Loader\YamlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('services.yml'); } }
- Create configuration files per bundles:
# Acme/AcmeBundle/Resources/config/acme_config.yml acme_config: AcmeBundle:User: ROLE_USER_ADMIN AcmeBundle:Position: ROLE_USER_ADMIN
# AcmePost/AcmePostBundle/Resources/config/acme_config.yml acme_config: AcmePostBundle:Post: ROLE_POST_ADMIN
This method allows you create and remove configurations in the bundles without global changes in the project. You can
remove some configuration in the needed bundle or even remove whole bundle ( for example AcmePostBundle
).
Note: By default method getConfigurationsFromFile($fileName, ContainerBuilder $container, $merge = true)
uses
standard PHP function array_merge_recursive to merge
all found configurations. If you want prepare configuration by yourself put false
as third parameter and receive
stack of the all registered configurations.