adrenalinkin/config-helper

扩展 Symfony 依赖注入组件,并允许通过通用的 YAML 文件在各个包中分别存储配置

v1.0.6 2018-07-27 10:30 UTC

This package is auto-updated.

Last update: 2024-09-09 00:59:29 UTC


README

简介

组件允许扩展标准类 Symfony\Component\DependencyInjection\Extension\Extension 并打开在所有注册的包中收集 YAML 配置的可能性。

安装

打开命令控制台,进入您的项目目录,并执行以下命令以下载此组件的最新稳定版本

    composer require adrenalinkin/config-helper

此命令要求您全局安装 Composer

使用示例和与标准方法的比较

假设我们的项目中包含两个包。包包含两个独立系统部分的业务逻辑

  • AcmeBundle 包含实体 AcmeBundle:UserAcmeBundle:Position
  • AcmePostBundle 包含实体 AcmePostBundle:Post

想象一下,您需要为每个实体添加配置。假设我们需要配置来决定用户系统角色以便访问特定功能。为此,已创建包 AcmeConfigBundle。配置示例

acme_config:
    AcmeBundle:User:     ROLE_USER_ADMIN # key - name of the entity; value - role
    AcmeBundle:Position: ROLE_USER_ADMIN
    AcmePostBundle:Post: ROLE_POST_ADMIN

标准方法

我们可以将配置放入全局配置文件 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

我们还可以将配置放入 AcmeConfigBundle 包下的特定配置文件,并从 AcmeConfigExtension 加载

#Acme/ConfigBundle/Resources/config/custom.yml
acme_config:
    AcmeBundle:User:     ROLE_USER_ADMIN
    AcmeBundle:Position: ROLE_USER_ADMIN
    AcmePostBundle:Post: ROLE_POST_ADMIN

然而,这两种方法,对于我们的实现,有一个缺点。每次我们创建新的包时,我们都将需要修改全局配置文件或 AcmeConfigBundle 中的配置文件。**这两种情况都会在项目的各个部分之间产生硬链接**

组件使用

为了防止项目各部分之间的硬链接,您需要

  • 为配置存储选择文件名,例如 acme_config.yml
  • AbstractExtension 扩展 AcmeConfigExtension
<?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');
    }
}
  • 按包创建配置文件
# 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

此方法允许您在不进行项目全局更改的情况下创建和删除包中的配置。您可以在需要的包中删除某些配置,甚至删除整个包(例如 AcmePostBundle)。

注意:默认情况下,方法 getConfigurationsFromFile($fileName, ContainerBuilder $container, $merge = true) 使用标准的 PHP 函数 array_merge_recursive 合并所有找到的配置。如果您想自己准备配置,请将第三个参数设为 false 并接收所有注册配置的堆栈。

许可证

license